Specified key was too long; max key length is 767 bytes解決方案

問題描述:

  1.  使用spark sql處理數據邏輯,邏輯處理後使用 df.write.mode(saveMode).jdbc(url, tableName, connectionProperties)將數據寫入mysql,建立的數據結構爲:mysql

CREATE TABLE `userinfo` (
`userId` TEXT NULL COLLATE 'utf8mb4_unicode_ci',
`name` TEXT NULL COLLATE 'utf8mb4_unicode_ci',
`mobile` TEXT NULL COLLATE 'utf8mb4_unicode_ci',
`schoolId` TEXT NULL COLLATE 'utf8mb4_unicode_ci'
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB  

2. 爲表建立索引 sql

執行到以下語句會拋出 Specified key was too long; max key length is 767 bytes的錯誤數據結構

 statement.executeUpdate("ALTER TABLE " + tableName + " ADD INDEX index_userIdAndSchoolId(userId,schoolId)")  

 問題緣由:url

是因爲mysql的最大索引長度致使,默認狀況下,InnoDB 引擎單一字段索引的長度最大爲 767 字節 即: 768/2=384個雙字節 或者 768/3=256個三字節的字段 , GBK是雙字節的,UTF-8是三字節的,utf8mb4_unicode_ci是四字節的,長度爲0~65535字節,因此爲utf8mb4_unicode_ci長度爲類型的字段建立索引會出現此錯誤。
解決方案:

 建立索引時,爲索引字段指定長度。spa

  statement.executeUpdate("ALTER TABLE " + tableName + " ADD INDEX index_userIdAndSchoolId(userId(180),schoolId(20))")  code

Mysql數據類型以下:索引

數字型 ci

類型
大小
範圍(有符號)
範圍(無符號)
用途
TINYINT
1 字節
(-128,127)
(0,255)
小整數值
SMALLINT
2 字節
(-32 768,32 767)
(0,65 535)
大整數值
MEDIUMINT
3 字節
(-8 388 608,8 388 607)
(0,16 777 215)
大整數值
INT或INTEGER
4 字節
(-2 147 483 648,2 147 483 647)
(0,4 294 967 295)
大整數值
BIGINT
8 字節
(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)
(0,18 446 744 073 709 551 615)
極大整數值
FLOAT
4 字節
(-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)
0,(1.175 494 351 E-38,3.402 823 466 E+38)
單精度
浮點數值
DOUBLE
8 字節
(1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
雙精度
浮點數值
DECIMAL
對DECIMAL(M,D) ,若是M>D,爲M+2不然爲D+2
依賴於M和D的值
依賴於M和D的值
小數值

字符型unicode

CHAR
0-255字節
定長字符串
VARCHAR
0-255字節
變長字符串
TINYBLOB
0-255字節
不超過 255 個字符的二進制字符串
TINYTEXT
0-255字節
短文本字符串
BLOB
0-65 535字節
二進制形式的長文本數據
TEXT
0-65 535字節
長文本數據
MEDIUMBLOB
0-16 777 215字節
二進制形式的中等長度文本數據
MEDIUMTEXT
0-16 777 215字節
中等長度文本數據
LOGNGBLOB
0-4 294 967 295字節
二進制形式的極大文本數據
LONGTEXT
0-4 294 967 295字節
極大文本數據

枚舉類型 字符串

ENUM (最多65535個成員)                              64KB

SET  (最多64個成員)                                 64KB

日期類型 

類型
大小
(字節)
範圍
格式
用途
DATE
3
1000-01-01/9999-12-31
YYYY-MM-DD
日期值
TIME
3
'-838:59:59'/'838:59:59'
HH:MM:SS
時間值或持續時間
YEAR
1
1901/2155
YYYY
年份值
DATETIME
8
1000-01-01 00:00:00/9999-12-31 23:59:59
YYYY-MM-DD HH:MM:SS
混合日期和時間值
TIMESTAMP
8
1970-01-01 00:00:00/2037 年某時
YYYYMMDD HHMMSS
混合日期和時間值,時間戳
相關文章
相關標籤/搜索