资讯专栏INFORMATION COLUMN

MySql字符集修改

jsliang / 1865人阅读

摘要:但是,在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。相比选择哪一种,使用者更应该关心字符集与排序规则在里需要统一。

问题分析

普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战、避免 emoji 表情符号带来的问题、涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集,这必须要作为移动互联网行业的一个技术选型的要点

Mysql 版本的限制,Mysql 5.5.3之前的版本,支持的utf8为3字节的,Mysql 5.5.3之后的版本支持utf8mb4

解决方案

首先我们看下哪些地方可能需要我们修改编码:

库(database)的编码

表(table)的编码

字段(column)的编码

程序中,数据库的连接url

mysql的配置文件my.conf中

我们可以先查询下当前数据库的编码信息:

SHOW VARIABLES LIKE "character_set_%"
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
character_sets_dir /opt/install/mysql/share/charsets/

我们将库的编码修改

datebase charset=utf8mb4 
datebase collation=utf8mb4_unicode_ci

将表的编码修改

character set=utf8mb4
collation=utf8mb4_unicode_ci

将需要支持emoji表情字段的编码修改

Charset=utf8mb4
Collation=utf8mb4_unicode_ci

修改mysql的配置文件my.conf

[client]
# 客户端来源数据的默认字符集
default-character-set = utf8mb4

[mysql]
# 数据库默认字符集
default-character-set = utf8mb4

[mysqld]
# 服务端默认字符集
character-set-server=utf8mb4
# 连接层默认字符集
collation-server=utf8mb4_unicode_ci

修改完毕后,记得重新启动mysql服务

/etc/init.d/mysql restart

修改后,刷新连接后查看相关变量:

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/install/mysql/share/charsets/

实测:修改项目中的连接数据库的url,将characterEncoding=utf-8去掉,实测此步骤可以不用改变。

字符集知识扩展

字符集、连接字符集、排序字符集

utf8mb4对应的排序字符集有utf8mb4_unicode_ci、utf8mb4_general_ci.

utf8mb4_unicode_ci和utf8mb4_general_ci的对比:

准确性:

utf8mb4_unicode_ci是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序

utf8mb4_general_ci没有实现Unicode排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。

但是,在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。

性能

utf8mb4_general_ci在比较和排序的时候更快

utf8mb4_unicode_ci在特殊情况下,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。

但是在绝大多数情况下发,不会发生此类复杂比较。相比选择哪一种collation,使用者更应该关心字符集与排序规则在db里需要统一。

至于排序规则(collation) 选择默认的 utf8mb4_general_ci,还是 utf8mb4_unicode_ci。 请参考stack overflow的这篇帖子。 讨论结果从排序的准确性,以及性能方面,告诉我们应该选用 utf8mb4_unicode_ci

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/48254.html

相关文章

  • MySQL符集utf8修改为utf8mb4

    摘要:兼容,且比能表示更多的字符,是字符集的超集。所以现在一些新的业务,比如等,会将数据库的字符集设置为。经过几次测试后,数据库的中关于字符集的配置修改为下面的配置了 对于mysql 5.5 而言,如果不设定字符集,mysql默认的字符集是 latin1 拉丁文字符集; 但随着各种业务的进一步发展,除了各个国家的本身语言字符,经常也会有一些表情符号出现在应用程序中,而在mysql 5.5 之...

    neuSnail 评论0 收藏0
  • Application无法传递Emoji字符MySQL的问题

    摘要:中无法存储字符,源自于之前编码只支持最大个字节,而需要个字节。事实上,如果只是某个列存在字符的存储问题,那就只需要修改这个列的编码类型即可。这涉及到应用与建立连接的问题。有一条命令是,会将的编码统一设置。使用这条命令便可以达到我们的目的。 MySQL中无法存储Emoji字符,源自于MySQL 5.5之前utf8编码只支持最大3个字节,而Emoji需要4个字节。从MySQL 5.5开始,...

    dmlllll 评论0 收藏0
  • Application无法传递Emoji字符MySQL的问题

    摘要:中无法存储字符,源自于之前编码只支持最大个字节,而需要个字节。事实上,如果只是某个列存在字符的存储问题,那就只需要修改这个列的编码类型即可。这涉及到应用与建立连接的问题。有一条命令是,会将的编码统一设置。使用这条命令便可以达到我们的目的。 MySQL中无法存储Emoji字符,源自于MySQL 5.5之前utf8编码只支持最大3个字节,而Emoji需要4个字节。从MySQL 5.5开始,...

    whinc 评论0 收藏0
  • MacOS: 如何设置 MySQL 数据库采用 utf8mb4 符集

    摘要:第一部分网上搜到的答案一般都说修改就可以了。但是在里,你找不到的文件,因为里面一开始就没有这么一个文件。那么我们首先要创造它们。第三部分还要在里面改一下数据库的链接代码注意 https://www.linuxidc.com/Linu... 为了应对无线互联网的机遇和挑战、避免 emoji 表情符号带来的问题、MySQL 数据库建议都提前采用 utf8mb4 字符集. 总结一下: 要完成...

    YancyYe 评论0 收藏0
  • MySQL 批量修改数据表编码及符集

    摘要:当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改。以下备注批量修改方案以修改为为例,注意将换为真实的数据库名。此外,对于数据表比较多的数据库,可以先将第一步的执行结果导出到文件,再通过该文件执行即可。 当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改。以下备注批量修改方案( 以修改为 utf8mb4_bin 为例,注意将 db...

    Zhuxy 评论0 收藏0

发表评论

0条评论

阅读需要支付1元查看
<