溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中創建表失敗如何解決

發布時間:2021-07-28 17:04:01 來源:億速云 閱讀:426 作者:Leah 欄目:MySQL數據庫

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中創建表失敗如何解決問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女