关于字符集问题,大家都对UTF8很熟悉。在MySQL中UTF8和UTF8MB4有什么区别呢?为什么强烈建议大家从UTF8换成UTF8MB4呢?下面的报错呢?大家是否眼熟呢?这是我碰到的一个报错:Incorrect string value: '\\xF0\\xA4\\x8B\\xAE')...' for column 'text'
关于他们的区别,我的第一感觉是UTF8MB4可以存入表情符而UTF8不可以?不知道大家的第一感觉是不是这样呢?最近部署东西用的是8.0,中间偶然的测试碰到类似的报错,通过排查后,发现和字符集有关,自己原先对UTF8的理解有误差,不完全正确。现在暂且不解释,大家先看下面的例子,然后再做解释。
a、创建表结构:CREATE TABLE `t` (
`s1` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL
)
b、插入相关语句:insert into t values('啊')
insert into t values('𤋮')
测试完毕后,大家应该会看到和我开头说的信息类似的报错?为啥呢?插入中文都会报错,这就是为啥我强烈推荐大家使用UTF8MB4字符集的原因!!!
上面的列子是从实际应用中,给大家的解释。下面我从MySQL的官方文档层面的解释来解释这个问题:utf8 is an alias for the utf8mb3 character set
The utf8mb3 character set has these characteristics:
Supports BMP characters only (no support for supplementary characters)
Requires a maximum of three bytes per multibyte character.
Applications that use UTF-8 data but require supplementary character support should use utf8mb4 rather than utf8mb3
通俗点讲,UTF8只支持3-Byte UTF-8 Unicode Encoding,支支持BMP而不支持supplementary characters;相反UTF8MB4则同时支持以上两种,比UTF多了1Byte。如果大家有时间的话,可以测试下上面的语句是不是在UTF8MB4的时候都可以插入呢?
我们的汉字很多,通俗点理解就是我们有点汉字用到了supplementary characters,而有的汉字仅仅BMP characters即可。关于具体的汉字所用到那种,我就不去深入研究了。实在搞不懂。如果有特别熟悉的朋友,是否可以来个通俗的理解法呢?谢谢!
总而言之,对于MySQL来说,强烈建议大家使用UTF8MB4字符集,千万不要再使用UTF8了。