MySQL中創建表失敗如何解決,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
今天有一個朋友問我一個MySQL的建表問題,問題的現象是創建表失敗,根據他的反饋,問題比較奇怪,
CREATE TABLE XXX
..此處省略260多個字段
`xxxxIsAllowIn` varchar(4) COLLATE utf8_bin DEFAULT NULL COMMENT 'xx是否準入(是,否)',
`xxxxIsAllowIn` varchar(30) COLLATE utf8_bin DEFAULT NULL COMMENT '理財-準入',
PRIMARY KEY (`SERIALNO`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='???????”3èˉ·?????ˉ';
是的,你沒有看錯,還有亂碼,根據朋友反饋的現象是在生產環境可以創建成功,但是測試環境創建失敗。
報錯信息為:
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
我把文本拷貝到本地,想復現,結果因為亂碼直接執行失敗,對于這種情況,還是同事幫我做了下問題過濾,采用如下的方式即可把注釋刪除。
cat a.sql |sed 's/COMMENT'.*'/,/g'
所以省事了不少,我就來繼續分析這個問題。一般來說這個錯誤看起來是單行的數據超出限制了,因為MySQL里面每行的數據有一個65535的限制,想必是這個原因吧。
但是朋友反饋是沒有超出這個限制的,根據里面的字符類型做計算,發現確實沒有達到65535.
所以這個問題就微妙起來,我們來說說幾種解決方式。
解決方式1:
修改存儲引擎,設置為myisam
...
KEY `idx_customerName` (`CUSTOMERNAME`)
) ENGINE=myisam DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
"c.sql" 276L, 16070C written
mysql> source c.sql
Query OK, 0 rows affected (0.07 sec)
MyISAM有3種行存儲格式:fixed/dynamic/compressed,InnoDB在這個基礎上增加了Barracuda的格式。
5.7中的默認參數設置如下:
mysql> show variables like '%format';
+---------------------------+-------------------+
| Variable_name | Value |
+---------------------------+-------------------+
| binlog_format | ROW |
| date_format | %Y-%m-%d |
| datetime_format | %Y-%m-%d %H:%i:%s |
| default_week_format | 0 |
| innodb_default_row_format | dynamic |
| innodb_file_format | Barracuda |
| time_format | %H:%i:%s |
+---------------------------+-------------------+
7 rows in set (0.00 sec)
所以現在的問題差異就在于MyISAM和InnoDB。
共享表空間的格式為Antelope,在5.5中默認就是這個格式。
解決方式2;
這個問題我做了一些測試。對比了字符集,row_format的設置。
) ENGINE=innodb row_format=dynamic DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
"c.sql" 276L, 16090C written
mysql> source c.sql
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB p
) ENGINE=innodb row_format=compact DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
"c.sql" 276L, 16090C written
mysql> source c.sql
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
) ENGINE=innodb DEFAULT CHARSET=latin1;
"c.sql" 276L, 16056C written
mysql> source c.sql
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
得到的一個初步結論就是先設置innodb_strict_mode為off,默認5.7是開啟的,當然從MySQL5.5版本開始,可以開啟InnoDB嚴格檢查模式,如果采用了頁數據壓縮功能后,建議是開啟該功能。在創建表,更改表和創建索引時,如果寫法有錯誤,不會有警告信息,而是直接拋出錯誤,這樣就可直接將問題扼殺在搖籃里。
當然這個里的這個問題現象確實比較糾結。
解決方法3:
從表結構設計入手,盡可能拆分這個表的邏輯,把它拆分為多個表。一個表的字段數盡可能不要太多。數據庫、表數量盡可能少;數據庫一般不超過50個,每個數據庫下,數據表數量一般不超過500個(包括分區表);可以很明顯看出這個表的設計就是根據業務的需求開始垂直擴展,其實可以拆分出一個邏輯表,邏輯數據很容易持續擴展,而不是在字段層面來不斷擴展。
關于MySQL中創建表失敗如何解決問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。