MySQL的字符集从latin1经过utf8再到utf8mb4,这是一条曲折的路线。尤其是从一个字符集转换到另一个字符集的时候,在实践中很无奈。不是不可以,但是麻烦。在MySQL8.0中,多了一个字符集utf8mb4_0900_*,所以有必要了解一下。1.字符集基础首先了解MySQL字符集用在什么地方,输入数据库VARIABLES参数一目了然:mysql>SHOWVARIABLESWHEREvariable_nameLIKE'%character%'ORvariable_nameLIKE'%collat??ion%';+---------------------------------+-------------------------------------+|Variable_name|Value|+--------------------------------+----------------------------------+|character_set_client|utf8mb4||character_set_connection|utf8mb4||character_set_database|utf8mb4||character_set_filesystem|binary||character_set_results|utf8mb4||character_set_server|utf8mb4||character_set_system|utf8||character_sets_dir|/opt/idc/mysql8.0.23/share/charsets/||collat??ion_connection|utf8mb4_bin||collat??ion_mb4_bin|utfcollat??ion_server|utf8mb4_bin||default_collat??ion_for_utf8mb4|utf8mb4_0900_ai_ci|+----------------------------+------------------------------------+从上面客户端、连接、数据库、结果逐层链接,任意链接不兼容的字符集会造成乱码。MySQL8.0utf8mb4Unicode字符集新的通用排序规则,命名为utf8mb4_0900_ai_ci。MySQL8.0默认为utf8mb4_0900_ai_ci,即utf8mb4_unicode_ci之一。其中每个字段代表什么意思:uft8mb4表示UTF-8编码方案,每个字符最多占4个字节。utf8mb3也是Unicode字符集的UTF-8编码,每个字符使用一到三个字节。(utf8:utf8mb3的别名)0900是Unicode校对算法版本。(UnicodeCollat??ionAlgorithm是用来比较两个符合Unicode标准要求的Unicode字符串的方法)。ai指的是口音不敏感。即排序时e、è、é、ê、?没有区别,不区分重音。ci表示不区分大小写。排序时p和P没有区别。进一步了解utf8和utf8mb4在某些场景下的问题:utf8编码最多支持3个字节的数据,而emoji表情和部分字符不能存储在4个字节的utf8中。演讲扩展了utf8mb4字符集来解决这个问题。常用字符集:utf8mb4_bin:将字符串的各个字符编译存储为二进制数据,区分大小写,可以存储二进制内容utf8mb4_general_ci:ci不区分大小写,不区分大小写。未实现Unicode排序规则,遇到一些特殊语言或字符集时,排序结果可能不一致。但在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。utf8mb4_unicode_ci:基于标准的Unicode进行排序比较,可以在各种语言之间准确排序。Unicode排序规则实现了一个稍微复杂的排序算法,以便能够处理特殊字符。2、字符集配置如何设置mysql字符集,更改操作:1)my.cnf配置文件信息,建议在初始化时设置。[mysqld]character-set-server=utf8mb4collat??ion-server=utf8mb4_unicode_cicharacter-set-client-handshake=FALSE#这里是忽略客户端的字符集,使用服务器的设置2)init_connect='SETNAMESutf8mb4'#serverforeach连接的客户端执行的字符串对于某些超级管理源无效。3)字符集的变化,包括库、表、列的变化。完全可以拥有自己的字符集。##更改DATABASEALTERDATABASE`db1`DEFAULTCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci##更改TABLEALTERTABLE`t1`DEFAULTCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci##更改column字段ALTERTABLE`t1`modify`name`varchar(80)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ciCOMMENT'昵称';4)日常字符集检查工作:SELECTb.SCHEMA_NAME,b.DEFAULT_CHARACTER_SET_NAME,b.DEFAULT_COLLATION_NAME,a.TABLE_NAME,a.TABLE_COLLATIONFROMinformation_schema.SCHEMATableftjoininformation_schema.TABLESaonb.SCHEMA_NAME=a.TABLE_SCHEMAWHEREb.SCHEMA_NAMEnotin('information_schema','mysql','performance_schema','sys')_ORDERBYTABLE方便设置、更改操作、检查。字符集不再是隐藏的问题。3、字符集对数据库的影响字符集对整个数据库的影响是相当大的。库更改对以前存在的表字段等没有影响。所以数据库>表>字段可以单独设置字符集。FAQ1:有索引但没有消失,因为字符集隐式转换FAQ2:不同字符串值(CHAR、VARCHAR和TEXT)的比较在尾随空格方面与其他排序规则不同。例如,'a'和'a'比较为不同的字符串,而不是相同的字符串。对于字符集排序,字符串末尾的空格也做相应处理。mysql>SELECTCOLLATION_NAME,PAD_ATTRIBUTEFROMINFORMATION_SCHEMA.COLLATIONSWHERECHARACTER_SET_NAME='utf8mb4';+----------------------------+-----------------+|COLLATION_NAME|PAD_ATTRIBUTE|+----------------------------+---------------+|utf8mb4_general_ci|PADSPACE||utf8mb4_bin|PADSPACE||utf8mb4_unicode_ci|PADSPACE||utf8mb4_icelandic_ci|PADSPACE||utf8mb4_latvian_ci|PADSPACE||……|utf8mb4_0900_ai_ci|NOPAD||utf8mb4_de_pb_0900_ai_ci|NOPAD||utf8mb4_0900_bin|NOPAD|+------------------------+----------------+注意:选择使用utf8mb4_0900字符集后需要对空格进行处理。常见问题3:除了lower_case_table_names,如何有效利用大小写字符集设置数据的大小写区分,可以使用ut8mb4_bin字符集,解决查询和数据插入。常见问题四:表情,部分字符常见错误码:1366Incorrectstringvalue:'\xF0\x9F\x99\x82'forcolumn'name'atrow2指定Utf8mb4字符集,然后配合character-set-client-handshake属性说明:对于jdbc,没有utf8mb4这样的字符集。4.总结从最初的安装开始,就需要配置字符集。8.0版本的utf8mb4_0900目前暂无类似bug,但需谨慎使用。只需选择utf8mb4_unicode_ci。小事加起来会变成大事。
