文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

不可忽视的MySQL字符集

2024-12-03 08:11

关注

[[389232]]

1. 字符集基础

先了解下MySQL字符集都有哪些地方使用,进入数据库VARIABLES参数一目了然:

 

  1. mysql> SHOW VARIABLES  WHERE variable_name LIKE '%character%'  OR  variable_name  LIKE '%collation%'  ; 
  2. +-------------------------------+--------------------------------------+ 
  3. | Variable_name                 | Value                                | 
  4. +-------------------------------+--------------------------------------+ 
  5. | character_set_client          | utf8mb4                              | 
  6. | character_set_connection      | utf8mb4                              | 
  7. | character_set_database        | utf8mb4                              | 
  8. | character_set_filesystem      | binary                               | 
  9. | character_set_results         | utf8mb4                              | 
  10. | character_set_server          | utf8mb4                              | 
  11. | character_set_system          | utf8                                 | 
  12. | character_sets_dir            | /opt/idc/mysql8.0.23/share/charsets/ | 
  13. | collation_connection          | utf8mb4_bin                          | 
  14. | collation_database            | utf8mb4_bin                          | 
  15. | collation_server              | utf8mb4_bin                          | 
  16. | default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci                   | 
  17. +-------------------------------+--------------------------------------+ 

从上面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排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。

2. 字符集配置

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的变更。都可以完全的拥有自己的字符集。

 

  1. ##更改DATABASE  
  2. ALTER DATABASE `db1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  
  3.  
  4. ##更改TABLE  
  5. ALTER TABLE `t1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  
  6.  
  7. ##更改column字段  
  8. ALTER TABLE `t1`  modify `namevarchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '昵称'

4)日常字符集检查工作:

 

  1. SELECT b.SCHEMA_NAME, b.DEFAULT_CHARACTER_SET_NAME, b.DEFAULT_COLLATION_NAME ,a.TABLE_NAME, 
  2. a.TABLE_COLLATION  
  3. FROM  information_schema.SCHEMATA b   left join information_schema.TABLES   a  
  4. on  b.SCHEMA_NAME =a. TABLE_SCHEMA  
  5. WHERE  b.SCHEMA_NAME not in ('information_schema' ,'mysql','performance_schema''sys')  
  6. ORDER BY TABLE_SCHEMA,TABLE_NAME ; 

通过多方便设置,更改操作,检查。字符集不再是隐藏问题。

3. 字符集对于数据库的影响

字符集对整个数据库影响面还是比较可观的。库更改 对于原先存在的表字段 都不影响 依次类推。所以数据库>表>字段 都可以单独设置字符集。

常见问题1:有索引 没有走 因为进行了 字符集隐式转换

 

常见问题2:在尾随空格方面不同

字符串值(CHAR、VARCHAR和TEXT)的比较与其他排序规则在尾随空格方面不同。For example, ‘a’ and 'a ’ 作为不同的字符串比较,而不是相同的字符串。

 

对于字符集排序来说,字符串末尾的空格也有对应的处理。

 

  1. mysql> SELECT COLLATION_NAME, PAD_ATTRIBUTE  FROM INFORMATION_SCHEMA.COLLATIONS   
  2. WHERE CHARACTER_SET_NAME = 'utf8mb4'
  3. +----------------------------+---------------+ 
  4. | COLLATION_NAME             | PAD_ATTRIBUTE | 
  5. +----------------------------+---------------+ 
  6. | utf8mb4_general_ci         | PAD SPACE     | 
  7. | utf8mb4_bin                | PAD SPACE     | 
  8. | utf8mb4_unicode_ci         | PAD SPACE     | 
  9. | utf8mb4_icelandic_ci       | PAD SPACE     | 
  10. | utf8mb4_latvian_ci         | PAD SPACE     | 
  11. | ......... 
  12. | utf8mb4_0900_ai_ci         | NO PAD        | 
  13. | utf8mb4_de_pb_0900_ai_ci   | NO PAD        | 
  14. | utf8mb4_0900_bin           | NO PAD        | 
  15. +----------------------------+---------------+ 

注意:在选择使用utf8mb4_0900 字符集之后空格 就需要处理。

常见问题3:对于数据的大小写敏感

除了lower_case_table_names之外,怎样有效使用大小写字符集设置,采用ut8mb4_bin字符集 既可,查询和数据插入解决。

 

常见问题4:表情符,偏生字

常见错误代码:1366 Incorrect string value: ‘\xF0\x9F\x99\x82’ for column ‘name’ at row 2

指定Utf8mb4字符集,再配合character-set-client-handshake属性

 

备注:对于jdbc来说没有utf8mb4这样的字符集说法。

4. 总结

从初期安装开始,就需要配置好字符集,8.0版本的utf8mb4_0900目前为止也没有类似的bug之类的,但还需要谨慎使用。选择utf8mb4_unicode_ci即可。

一件件小事,积累起来就是变成大事。

来源:数据和云内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯