問題描述
新建表或者修改表varchar字段長度的時候,出現(xiàn)這個錯誤
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
大概意思就是行大小太大,不能超過65535
長度改為21842就正常了,這是為什么?
分析
最終我們執(zhí)行正確的SQL語句
CREATE TABLE `all_type_forlan` (
`id` int(20) NOT NULL COMMENT 'id',
`base_info` varchar(21842) DEFAULT NULL COMMENT '基本詳細(xì)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
這里的21842長度是怎么來的?
首先它是什么意思?表示21842字符
首先來了解幾個規(guī)則,對我們的字符數(shù)有影響的規(guī)則
1、MySQL規(guī)則
編碼規(guī)則
不同字符集下,占用空間不一樣
gbk編碼中,1個字符占用2個字節(jié)
utf8編碼(默認(rèn))中,1個字符占用3個字節(jié)
utf8mb4編碼中,1個字符占用4個字節(jié)
存儲規(guī)則
varchar除了存儲字符,還需要額外的空間來存儲長度和是否為NULL,分別占用1-2字節(jié)和1字節(jié)
行大小限制
MySQL 表的內(nèi)部表示具有 65,535 字節(jié)的最大行大小限制,即使存儲引擎能夠支持更大的行。 BLOB 和 TEXT列僅對行大小限制貢獻(xiàn) 9 到 12 個字節(jié),因?yàn)樗鼈兊膬?nèi)容與行的其余部分分開存儲
2、驗(yàn)證
根據(jù)行最大65535字節(jié),我們選擇utf8編碼,那我們最多可以設(shè)置的字符數(shù)為65535/3=21845
還是報錯了,因?yàn)槲覀冞€需要減去額外的存儲(長度和是否為NULL),65535-3=65532/2=21844,設(shè)置成21844就成功了
驗(yàn)證NULL占用1個字節(jié)
65535-1-3=65531/3=21,843.66666666667,向下取整,最多只能21843,所以報錯啦,看下圖說明:tinyint占用1個字節(jié)、varchar的長度和是否為NULL占用3個字節(jié)
我們把varchar字段設(shè)為不是null,此時21844可以設(shè)置成功說明:65535-1-2=65532/3=21844
3、結(jié)論
所以,至此,我們就知道為什么21842才可以了
計算規(guī)則=(65535-4-2-1)/3=21,842.66666666667,向下取整,就是21842說明:int占用4個字節(jié),varchar的長度和是否為NULL占用3個字節(jié),使用了utf8編碼,1個字符占用3個字節(jié)
解決方案
如果長度需要加長,將字段類型改為TEXT或BLOB
如果只是想設(shè)置一個最大值,那可以根據(jù)計算規(guī)則進(jìn)行調(diào)整
拓展
為什么我們經(jīng)常使用varchar(255),不使用varchar(256)?
首先我們使用的varchar,除了存儲字符內(nèi)容,還需要額外存儲長度和是否為NULL
因?yàn)関archar類型的字段長度在超過255后,需要2個字節(jié)來存儲長度,因?yàn)?個字節(jié)=8位,可以表示的長度為255,2個字節(jié)=16位,可以表示的長度為65535
所以varchar(256)會比varchar(255)多占用1個字節(jié)來存儲長度
MySQL列數(shù)限制
MySQL 對每個表有 4096 列的硬性限制,但對于給定的表,有效最大值可能會更少,因?yàn)楸淼淖畲笮写笮∠拗屏肆械臄?shù)量文章來源:http://www.zghlxwxcb.cn/news/detail-446032.html
int類型的占用空間的大小范圍
文章來源地址http://www.zghlxwxcb.cn/news/detail-446032.html
到了這里,關(guān)于Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535.的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!