MySQL字符集都有哪些

57次阅读
没有评论

共计 3877 个字符,预计需要花费 10 分钟才能阅读完成。

今天就跟大家聊聊有关 MySQL 字符集都有哪些,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

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,egrave;,eacute;,ecirc; 和 euml; 之间没有区别,不区分重音。

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= lsquo;SET NAMES utf8mb4 rsquo; #服务器为每个连接的客户端执行的字符串, 对于一些超级管理源就不生效的

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, lsquo;a rsquo; and a rsquo;   作为不同的字符串比较,而不是相同的字符串。

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

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: lsquo;\xF0\x9F\x99\x82 rsquo; for column lsquo;name rsquo; at  row 2

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

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

看完上述内容,你们对 MySQL 字符集都有哪些有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-01发表,共计3877字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)