mysql创建表查询时行大小太大错误

Shi*_*dla 23 mysql

我正在尝试使用以下查询创建一个表

Create Table PerformaceReport
(
campaignID int,
keywordID bigint,
keyword varchar(8000),
avgPosition decimal(18,6),
cost int,
clicks int,
 conv1PerClick int, 
 impressions int,
  day datetime,
  currency varchar(8000),
  account varchar(8000),
   timeZone varchar(8000),
    adGroup varchar(8000),
    adGroupState varchar(8000),
     approvalStatus varchar(8000),
     lowestPosition varchar(8000),
     campaign varchar(8000),
      campaignState varchar(8000),
       convManyPerClick int,
       totalConvValue decimal(18,6),
        maxCPCSource varchar(8000),
         clientName varchar(8000),
          destinationURL varchar(8000),
           device varchar(8000),
           firstPageCPC int,
            isNegative bit,
             matchType varchar(8000),
              maxCPC varchar(8000),
               maxCPM varchar(8000),
               highestPosition varchar(8000),
               qualityScore int,
               keywordState varchar(8000),
               viewThroughConv int)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

#1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs
Run Code Online (Sandbox Code Playgroud)

任何人都可以让我知道如何避免此错误,并使查询工作创建一个表.

Azi*_*ziz 55

表中所有字段的总大小超过限制65535,这就是您收到此错误的原因.

您应该使用text类型而不是varchar长字符串.更换所有varchar(8000)text,它应该工作.

或者,更好的是,使用适当的数据类型而不是"太大"的数据类型.你真的不需要8000个字符来存储currency,对吗?

  • “表中*所有*字段的总大小” - 并再次学到了一些新东西。谢谢! (3认同)
  • MSSQL **没有** 有此限制。MySQL **确实**有这个限制。除非更改类型,否则无法在 MySQL 中创建此类表。 (2认同)

g10*_*ang 13

65535 字节是 mysql 的最大行大小。

对于 utf8mb4 字符集,varchar(255) 意味着该列最多使用255 * 4 + 1字节。所以这取决于使用什么字符集表。


Akh*_*hil 6

TEXT而不是VARCHAR.因为你超过了最大行数.如果使用TEXT,则适用于大型文本列.最大大小varchar为65535.创建一个列,varchar(65535)但它必须是表中唯一的列.

要么

问题是innodb表的行大小限制,在链接下面你可以找到一些方法来解决这个问题:

http://www.mysqlperformanceblog.com/2011/04/07/innodb-row-size-limitation/ https://dba.stackexchange.com/questions/6598/innodb-create-table-error-row-size-太大了


小智 6

这个问题出现在 Laravel 中,我使用了 text 而不是 varchar。


Pet*_*ter 5

我同意使用适当大小的列和 TEXT over VARCHAR 作为第一步的答案,但如果您仍然达到限制,如果您使用 UTF-8 或其他字符集超过每个字符一个字节,不需要它(例如仅存储英文文本)。我这样做是为了绕过非常宽的桌子所达到的限制。这里有更多细节。

utf8 和 latin1 的区别