【mysql】字符集utf8mb4和utf8的问题

近段碰到这么个bug,项目出现一个异常,`Incorrect string value: '***' from column nickname at row 34`。对应nickname字段是varchar类型、utf8字符集,之前有存入数据了。
再查下对应写入数据,好吧,大概明白什么情况了。原来用户昵称中包含了emoji字符,字符类型是4个字节,而mysql数据库utf8(也是utf8mb3)是最大支持3个字节长度,从而导致这类数据不能成功存储。

解决方法,就是要让数据能存储4个字节长度的字符,刚好mysql数据有utf8mb4字符集,只需要将对应字段更改为此字符集即可。

对于两个字符集有什么不同呢?

utf8字符集,中文字符以三个字节长度存储,英文字符以一个字节进行存储,mysql下是utf8,实际上也叫utf8mb3,因为该字符集是不能存储超过三个字节字符。
utf8mb4,算是utf8的一个超集,相比utf8多增加了一个字节的支持,而在其他方面,如编码、存储值、字符长度、存储特性等都是一样。
utf8变更为utf8mb4,不需要对字符做任何处理,不需要补充字符数据进行转换。而且在mysql8.0之后,数据库默认字符集都是utf8mb4。utf8mb4兼容utf8,可放心变更字符集。

注意

变更字符集之前,请先确定几个先决条件:

  • 数据库字符集,如果数据库字符集不是utf8mb4,单单更改字段字符集将是无效果。
  • 数据库版本,如果是5.5.3之前,不要尝试变更数据库字符集啦,先考虑是否能升级数据库版本吧。

对于升级比较麻烦的,建议在代码层面对emoji字符进行处理。即转码后入库存储。

你可能感兴趣的:(数据库,问题集)