文章目錄
- 問題
- 原因
- 問題復現
- 環境 & 版本
- 復現過程
- 解決方案
- 調整列大小
- 調整列類型
- 個人簡介
問題
- 當我們創建表或新增字段時,我們可能遇到下面這個問題:
1118 - 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 ,其中不包括 TEXT or BLOB 類型,建議調整一些列為 TEXT or BLOB 類型。
- 下面我們來具體分析一下這個問題,并探討如何解決。
原因
-
MySQL 行大小最大限制為65535,不包括TEXT、BLOB。
-
注:如果未啟用嚴格 SQL 模式, VARCHAR長度規范大于 65535 的列將轉換為 TEXT, VARBINARY長度規范大于 65535 的列將轉換為 BLOB。否則,在這兩種情況下都會發生錯誤。
-
參考:MySQL 5.7 官方文檔:13.1.18.6 Silent Column Specification Changes
問題復現
環境 & 版本
SELECT VERSION();5.7.36-log
復現過程
- 嘗試創建一個表 “tb_test”:
CREATE TABLE tb_test (row1 VARCHAR ( 10000 ) DEFAULT NULL,row2 VARCHAR ( 10000 ) DEFAULT NULL,row3 VARCHAR ( 10000 ) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8;// 創建失敗
1118 - 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// 為什么創建失敗
tb_test 使用 CHARSET = utf8,每個編碼字符占 3 個字節
則 tb_test 行長度為:1000 * 3 * = 90000 字節 > 63335
因此創建表失敗
解決方案
調整列大小
- 調整列大小使行大小 <= 65535。
CREATE TABLE tb_test (row1 VARCHAR ( 10000 ) DEFAULT NULL,row2 VARCHAR ( 10 ) DEFAULT NULL,row3 VARCHAR ( 10000 ) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8;tb_test 行長度為:10000 * 3 * 2 + 10 *3 = 60020 字節 < 63335// 創建成功
CREATE TABLE tb_test (row1 VARCHAR ( 10000 ) DEFAULT NULL,row2 VARCHAR ( 10 ) DEFAULT NULL,row3 VARCHAR ( 10000 ) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8
> OK
> 查詢時間: 0.087s
調整列類型
- 調整其中部分列類型為 TEXT or BLOBs(不計入行大小),使行大小 <= 65535。
CREATE TABLE tb_test(row1 VARCHAR ( 10000 ) DEFAULT NULL,row2 text DEFAULT NULL,row3 VARCHAR ( 10000 ) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8將 row2 調整為 text 類型
tb_test 行長度為:10000 * 3 * 2 = 60000 字節 < 63335// 創建成功
CREATE TABLE tb_test(row1 VARCHAR ( 10000 ) DEFAULT NULL,row2 text DEFAULT NULL,row3 VARCHAR ( 10000 ) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8
> OK
> 查詢時間: 0.023s
個人簡介
👋 你好,我是 Lorin 洛林,一位 Java 后端技術開發者!座右銘:Technology has the power to make the world a better place.
🚀 我對技術的熱情是我不斷學習和分享的動力。我的博客是一個關于Java生態系統、后端開發和最新技術趨勢的地方。
🧠 作為一個 Java 后端技術愛好者,我不僅熱衷于探索語言的新特性和技術的深度,還熱衷于分享我的見解和最佳實踐。我相信知識的分享和社區合作可以幫助我們共同成長。
💡 在我的博客上,你將找到關于Java核心概念、JVM 底層技術、常用框架如Spring和Mybatis 、MySQL等數據庫管理、RabbitMQ、Rocketmq等消息中間件、性能優化等內容的深入文章。我也將分享一些編程技巧和解決問題的方法,以幫助你更好地掌握Java編程。
🌐 我鼓勵互動和建立社區,因此請留下你的問題、建議或主題請求,讓我知道你感興趣的內容。此外,我將分享最新的互聯網和技術資訊,以確保你與技術世界的最新發展保持聯系。我期待與你一起在技術之路上前進,一起探討技術世界的無限可能性。
📖 保持關注我的博客,讓我們共同追求技術卓越。