查看mysql支持的字符集(不可忽视的MySQL字符集)
查看mysql支持的字符集
不可忽视的MySQL字符集MySQL的字符集从latin1经过utf8 到utf8mb4 ,算是经历曲折的路线。特别是从使用一个字符集变更另一个字符集时,实践当中都非常无奈,不是没办法,而是麻烦。到了MySQL8.0多出了一个字符集utf8mb4_0900_*的字符集,有必要了解一下。
1. 字符集基础
先了解下MySQL字符集都有哪些地方使用,进入数据库VARIABLES参数一目了然:
mysql> SHOW VARIABLES WHERE variable_name LIKE '%character%' OR variable_name LIKE '%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中的一种。
这些字段每个意义,代表着什么含义:
- uft8mb4 表示用 UTF-8 编码方案,每个字符最多占4个字节。
- utf8mb3也是Unicode字符集的UTF-8编码,每个字符使用一到三个字节。(utf8: utf8mb3的别名)
- 0900 就是Unicode 校对算法版本。(Unicode归类算法是用于比较符合Unicode标准要求的两个Unicode字符串的方法)。
- ai指的是口音不敏感。也就是说,排序时e,è,é,ê和ë之间没有区别,不区分重音。
- ci表示不区分大小写。排序时p和P之间没有区别。
再了解一下一些场景下 utf8 和 utf8mb4 的问题点:
utf8编码最多支持3字节的数据,而emoji表情符, 偏生字是4个字节的utf8无法存储的,致辞延伸出utf8mb4字符集解决这个问题。
日常常用的字符集:
- utf8mb4_bin:将字符串每个字符用二进制数据编译存储,区分大小写,而且可以存二进制的内
- utf8mb4_general_ci:ci即case insensitive,不区分大小写。没有实现Unicode排序规则,在遇到某些特殊语言或字符集,排序结果可能不一致。但在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。
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的变更。都可以完全的拥有自己的字符集。
##更改DATABASE
ALTER DATABASE `db1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
##更改TABLE
ALTER TABLE `t1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
##更改column字段
ALTER TABLE `t1` modify `name` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '昵称';
4)日常字符集检查工作:
SELECT b.SCHEMA_NAME, b.DEFAULT_CHARACTER_SET_NAME, b.DEFAULT_COLLATION_NAME ,a.TABLE_NAME,
a.TABLE_COLLATION
FROM information_schema.SCHEMATA b left join information_schema.TABLES a
on b.SCHEMA_NAME =a. TABLE_SCHEMA
WHERE b.SCHEMA_NAME not in ('information_schema' ,'mysql','performance_schema', 'sys')
ORDER BY TABLE_SCHEMA,TABLE_NAME ;
通过多方便设置,更改操作,检查。字符集不再是隐藏问题。
3. 字符集对于数据库的影响
字符集对整个数据库影响面还是比较可观的。库更改 对于原先存在的表字段 都不影响 依次类推。所以数据库>表>字段 都可以单独设置字符集。
常见问题1:有索引 没有走 因为进行了 字符集隐式转换
常见问题2:在尾随空格方面不同
字符串值(CHAR、VARCHAR和TEXT)的比较与其他排序规则在尾随空格方面不同。For example, ‘a’ and 'a ’ 作为不同的字符串比较,而不是相同的字符串。
对于字符集排序来说,字符串末尾的空格也有对应的处理。
mysql> SELECT COLLATION_NAME, PAD_ATTRIBUTE FROM INFORMATION_SCHEMA.COLLATIONS
WHERE CHARACTER_SET_NAME = 'utf8mb4';
+----------------------------+---------------+
| COLLATION_NAME | PAD_ATTRIBUTE |
+----------------------------+---------------+
| utf8mb4_general_ci | PAD SPACE |
| utf8mb4_bin | PAD SPACE |
| utf8mb4_unicode_ci | PAD SPACE |
| utf8mb4_icelandic_ci | PAD SPACE |
| utf8mb4_latvian_ci | PAD SPACE |
| .........
| utf8mb4_0900_ai_ci | NO PAD |
| utf8mb4_de_pb_0900_ai_ci | NO PAD |
| utf8mb4_0900_bin | NO PAD |
+----------------------------+---------------+
注意:在选择使用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即可。
一件件小事,积累起来就是变成大事。
原文地址:https://mp.weixin.qq.com/s?__biz=MjM5MDAxOTk2MQ==&mid=2650291037&idx=1&sn=734100268678caa39ef3281865e7db22&chksm=be47a34b89302a5de4234903afeb177438bfbd77794dd26028fb88c77de8f98744a2b4241c17&mpshare=1&
- mysql函数编写(MySQL中sum函数使用的实例教程)
- 怎么把csv文件导入mysql(mysql导入csv的4种报错的解决方法)
- python操作mysql连接池(详解Python连接MySQL数据库的多种方式)
- mysql的count知识(MySQL中MTR的概念)
- mysql显示所有数据库语句(MySQL数据库自动补全命令的三种方法)
- mysql时间戳和datetime对比(MySQL时间设置注意事项的深入总结)
- mysql中mergeinto的用法(MySQL中exists、in及any的基本用法)
- mysql exists的用法(Mysql exists用法小结)
- mysql为啥使用b+树(MySQL用B+树作为索引结构有什么好处)
- mysqltruncate分区自定义参数(MySQL truncate table语句的使用)
- MYSQL字符集设置的方法详解(终端的字符集)(MYSQL字符集设置的方法详解终端的字符集)
- navicat创建MySql定时任务的方法详解(navicat创建MySql定时任务的方法详解)
- mysql分组函数入门(详解MySQL 数据分组)
- MySQL中ROUND四舍五入函数需要注意的地方
- mysql的uuid说明(MySQL GTID全面总结)
- mysql主从复制配置(Mysql实现主从配置和多主多从配置)
- 《白狐的人生》热拍 贾征宇偶像包袱难自弃 图(白狐的人生热拍)
- 七夕取消了,牛郎织女没做核酸七夕已经取消(牛郎织女没做核酸七夕已经取消)
- 网友抵制 多地取消 夏日祭 为何惹众怒(网友抵制多地取消)
- 兄弟萌,今年的七夕又取消了 思考 思考(今年的七夕又取消了)
- 七夕取消是什么梗(七夕取消是什么梗)
- 这竟然是捏出来的 20种橡皮泥玩法让你轻松hold住魔娃(这竟然是捏出来的)
热门推荐
- idea配合tomcat进行web开发(IDEA2021 tomcat10 servlet 较新版本踩坑问题)
- numpy常用统计分析函数(Numpy之random函数使用学习)
- sqlcount优化(SQL优化教程之in与range查询)
- 网站如何提高用户体验
- web前端怎么设置图片的大小(Web前端绘制0.5像素的几种方法)
- php开发的主要技术(详解PHP神奇又有用的Trait)
- thinkphp5 api开发(thinkphp5框架前后端分离项目实现分页功能的方法分析)
- httpcontextbase 与 httpcontext
- sql计算时间间隔(sql中时间以5分钟半个小时任意间隔分组的实现方法)
- html样式中css怎么设置行高(CSS设置HTML元素的高度与宽度的各种情况总结)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9