2022-10-27 396
MySQL的字符集从latin1经过utf8 到utf8mb4 ,算是经历曲折的路线。特别是从使用一个字符集变更另一个字符集时,实践当中都非常无奈,不是没办法,而是麻烦。到了MySQL8.0多出了一个字符集utf8mb4_0900_*的字符集,有必要了解一下。
先了解下MySQL字符集都有哪些地方使用,进入数据库VARIABLES参数一目了然:
mysql>SHOWVARIABLESWHEREvariable_nameLIKE'%character%'ORvariable_nameLIKE'%collation%'; +-------------------------------+--------------------------------------+ |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/| |collation_connection|utf8mb4_bin| |collation_database|utf8mb4_bin| |collation_server|utf8mb4_bin| |default_collation_for_utf8mb4|utf8mb4_0900_ai_ci| +-------------------------------+--------------------------------------+
从上面client,connection,database,results层层环节扣着,任何一个环节的字符集不兼容都会出现乱码问题。
MySQL8.0 utf8mb4 Unicode字符集一个新的通用排序归类,被命名为utf8mb4_0900_ai_ci。MySQL 8.0默认的是utf8mb4_0900_ai_ci,属于 utf8mb4_unicode_ci中的一种。
这些字段每个意义,代表着什么含义:
再了解一下一些场景下 utf8 和 utf8mb4 的问题点:
utf8编码最多支持3字节的数据,而emoji表情符, 偏生字是4个字节的utf8无法存储的,致辞延伸出utf8mb4字符集解决这个问题。
日常常用的字符集:
utf8mb4_unicode_ci:是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。
mysql字符集如何设置,更改操作:
1)my.cnf配置文件信息,建议初始化时就设置好。
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
character-set-client-handshake = FALSE #此处是忽略客户端的字符集,使用服务器的设置
2)init_connect=‘SET NAMES utf8mb4’ #服务器为每个连接的客户端执行的字符串,对于一些超级管理源就不生效的
3)字符集变更,包含库,表,column的变更。都可以完全的拥有自己的字符集。
##更改DATABASE ALTERDATABASE`db1`DEFAULTCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci ##更改TABLE ALTERTABLE`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_COLLATION FROMinformation_schema.SCHEMATAbleftjoininformation_schema.TABLESa onb.SCHEMA_NAME=a.TABLE_SCHEMA WHEREb.SCHEMA_NAMEnotin('information_schema','mysql','performance_schema','sys') ORDERBYTABLE_SCHEMA,TABLE_NAME;
通过多方便设置,更改操作,检查。字符集不再是隐藏问题。
字符集对整个数据库影响面还是比较可观的。库更改 对于原先存在的表字段 都不影响 依次类推。所以数据库>表>字段 都可以单独设置字符集。
字符串值(CHAR、VARCHAR和TEXT)的比较与其他排序规则在尾随空格方面不同。For example, ‘a’ and ‘a ’ 作为不同的字符串比较,而不是相同的字符串。
对于字符集排序来说,字符串末尾的空格也有对应的处理。
mysql>SELECTCOLLATION_NAME,PAD_ATTRIBUTEFROMINFORMATION_SCHEMA.COLLATIONS WHERECHARACTER_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 字符集之后空格 就需要处理。
除了lower_case_table_names之外,怎样有效使用大小写字符集设置,采用ut8mb4_bin字符集 既可,查询和数据插入解决。
常见错误代码:1366 Incorrect string value: ‘\xF0\x9F\x99\x82’ for column ‘name’ at row 2
指定Utf8mb4字符集,再配合character-set-client-handshake属性
备注:对于jdbc来说没有utf8mb4这样的字符集说法。
从初期安装开始,就需要配置好字符集,8.0版本的utf8mb4_0900目前为止也没有类似的bug之类的,但还需要谨慎使用。选择utf8mb4_unicode_ci即可。
一件件小事,积累起来就是变成大事。
原文链接:https://77isp.com/post/10346.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态