zoukankan      html  css  js  c++  java
  • Specified key was too long; max key length is 767 bytes解决方案

    问题描述:

      1.  使用spark sql处理数据逻辑,逻辑处理后使用 df.write.mode(saveMode).jdbc(url, tableName, connectionProperties)将数据写入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. 为表创建索引 

    执行到如下语句会抛出 Specified key was too long; max key length is 767 bytes的错误

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

     问题原因:

    是由于mysql的最大索引长度导致,默认情况下,InnoDB 引擎单一字段索引的长度最大为 767 字节 即: 768/2=384个双字节 或者 768/3=256个三字节的字段 ,GBK是双字节的,UTF-8是三字节的,utf8mb4_unicode_ci是四字节的,长度为0~65535字节,所以为utf8mb4_unicode_ci长度为类型的字段创建索引会出现此错误。
    解决方案:

     创建索引时,为索引字段指定长度。

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

    Mysql数据类型如下:

    数字型 

    类型
    大小
    范围(有符号)
    范围(无符号)
    用途
    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的值
    小数值

    字符型

    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
    混合日期和时间值,时间戳
     
  • 相关阅读:
    应当将指针变量用“==”或“!=”与 NULL 比较
    不可将浮点变量用“==”或“!=”与任何数字比较
    应当将整型变量用“==”或“!=”直接与 0 比较
    不可将布尔变量直接与 TRUE、FALSE 或者 1、0 进行比较
    不要把程序中的复合表达式与“真正的数学表达式”混淆
    不要有多用途的复合表达式
    不要编写太复杂的复合表达式
    用括号确定表达式的操作顺序
    为了防止某一软件库中的一些标识符和其它软件库中的冲突
    类的数据成员加前缀 m_(表示 member)
  • 原文地址:https://www.cnblogs.com/abcdwxc/p/9855344.html
Copyright © 2011-2022 走看看