异常由来:
我们使用MySQL数据库utf8编码进入数据存储。
最近游戏接入到腾讯平台,因而通过接口获取其平台上的用户数据,发现取过来的用户名可谓五花八门,各种符号应有尽有。
导致入库时,出现Incorrect string value异常。
经过查阅得知:
MySQL中utf8编码默认为utf8mb3,既每字符最大占用3字节存储空间。
然而众多用户名中出现4字节字符,导致MySQL无法存储,因而抛出异常。
解决方案:
因utf8mb3无法支持4字节字符,因而只需要将对应字段编码更改为能支持4字节的编码(utf8mb4、utf16、utf32任意一种)即可。
因utf8mb4占用空间少,所以为最优选择。
utf8(utf8mb3)、utf8mb4、utf16、utf32的区别:
utf8(utf8mb3):使用1~3字节的空间对字符编码,就是字符是几字节就用几字节空间,但最大只能存储3字节。
utf8mb4:使用1~4字节的空间对字符编码,就是字符是几字节就用几字节空间,可以存储任意字符(因为不管何种字符,最大也就4字节)。
utf16:uses 2 bytes for the first 65,536 codepoints,and 4 bytes for everything else.可以理解为某些字符使用2字节,其他的使用4字节。
utf32:使用固定4个字节的空间对任意字符编码。
额外信息:
MySQL 5.5数据库之前的版本只支持ucs2和utf8两种Unicode字符集,即只支持Unicode 3.0的标准。
MySQL 5.5版本对于Unicode标准已经支持到5.0。共支持ucs2、utf8(utf8mb3)、utf8mb4、utf16,以及utf32五种Unicode编码。