我正在尝试使用以下查询创建一个表
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
任何人都可以让我知道如何避免此错误并使查询工作以创建表。
答案 0 :(得分:46)
表中所有字段的总大小超过限制65535,这就是您收到此错误的原因。
对于长字符串,您应该使用text
类型而不是varchar
。将所有varchar(8000)
替换为text
,它应该有效。
或者,更好的是,使用适当的数据类型而不是“太大”的数据类型。您不需要8000个字符来存储currency
,是吗?
答案 1 :(得分: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-too-large
答案 2 :(得分:1)
我同意使用适当大小的列和TEXT over VARCHAR作为第一步的答案,但如果您仍然达到限制,则可能需要更改该表的排序规则设置(如果您使用的是UTF-8或其他字符集)每个字符超过一个字节,不需要它(例如只存储英文文本)。我这样做是为了达到你想要一个非常宽的桌子的极限。这里有更多细节。
答案 3 :(得分:1)
此问题在Laravel中出现,我使用文本而不是varchar。
答案 4 :(得分:0)
答案 5 :(得分:0)
65535字节是mysql的最大行大小。
对于utf8mb4字符集,varchar(255)表示此列最多使用255 * 4 + 1
个字节。因此,这取决于使用什么字符集表。
答案 6 :(得分:0)
我使用了 10.4.17-MariaDB MariaDB 服务器,我通过编辑 MariaDB 服务器配置文件(位于 /etc/my.cnf.d/server.cnf)修复了它,并添加了这两行:
innodb_log_file_size=512M
innodb_strict_mode=0
答案 7 :(得分:-2)
尝试将存储引擎更改为CSV。