42

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

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)

我收到以下错误

#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

谁能告诉我如何避免此错误并使查询工作以创建表。

4

8 回答 8

89

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

您应该使用texttype 而不是varchar长字符串。全部替换varchar(8000)text,它应该可以工作。

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

于 2012-11-08T06:07:29.247 回答
10

使用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-太大了

于 2012-11-08T06:18:30.963 回答
6

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

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

于 2019-04-15T10:41:18.320 回答
3

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

utf8 和 latin1 的区别

于 2014-03-21T21:07:33.747 回答
3

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

于 2020-04-07T16:32:44.063 回答
1

我使用了 10.4.17-MariaDB MariaDB 服务器,并通过编辑 MariaDB 服务器配置文件(位于 /etc/my.cnf.d/server.cnf)修复了它并添加了这两行:

innodb_log_file_size=512M

innodb_strict_mode=0

于 2021-01-06T03:30:48.243 回答
0
  • 每个表(无论存储引擎如何)的最大行大小为 65,535 字节。存储引擎可能会对此限制施加额外的限制,从而减少有效的最大行大小。
  • BLOB 和 TEXT 列从 1 到 4 加上 8 个字节计入行大小限制,因为它们的内容与行的其余部分分开存储。
  • 详细信息 - 表列数和行大小限制
于 2016-09-09T07:14:28.057 回答
-6

尝试将存储引擎更改为 CSV。

于 2014-06-29T16:33:08.163 回答