摘要:但是,在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。相比选择哪一种,使用者更应该关心字符集与排序规则在里需要统一。
问题分析
普通的字符串或者表情都是占位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 5.5 而言,如果不设定字符集,mysql默认的字符集是 latin1 拉丁文字符集; 但随着各种业务的进一步发展,除了各个国家的本身语言字符,经常也会有一些表情符号出现在应用程序中,而在mysql 5.5 之...
摘要:中无法存储字符,源自于之前编码只支持最大个字节,而需要个字节。事实上,如果只是某个列存在字符的存储问题,那就只需要修改这个列的编码类型即可。这涉及到应用与建立连接的问题。有一条命令是,会将的编码统一设置。使用这条命令便可以达到我们的目的。 MySQL中无法存储Emoji字符,源自于MySQL 5.5之前utf8编码只支持最大3个字节,而Emoji需要4个字节。从MySQL 5.5开始,...
摘要:中无法存储字符,源自于之前编码只支持最大个字节,而需要个字节。事实上,如果只是某个列存在字符的存储问题,那就只需要修改这个列的编码类型即可。这涉及到应用与建立连接的问题。有一条命令是,会将的编码统一设置。使用这条命令便可以达到我们的目的。 MySQL中无法存储Emoji字符,源自于MySQL 5.5之前utf8编码只支持最大3个字节,而Emoji需要4个字节。从MySQL 5.5开始,...
摘要:第一部分网上搜到的答案一般都说修改就可以了。但是在里,你找不到的文件,因为里面一开始就没有这么一个文件。那么我们首先要创造它们。第三部分还要在里面改一下数据库的链接代码注意 https://www.linuxidc.com/Linu... 为了应对无线互联网的机遇和挑战、避免 emoji 表情符号带来的问题、MySQL 数据库建议都提前采用 utf8mb4 字符集. 总结一下: 要完成...
摘要:当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改。以下备注批量修改方案以修改为为例,注意将换为真实的数据库名。此外,对于数据表比较多的数据库,可以先将第一步的执行结果导出到文件,再通过该文件执行即可。 当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改。以下备注批量修改方案( 以修改为 utf8mb4_bin 为例,注意将 db...
阅读 3308·2021-11-22 09:34
阅读 3037·2021-11-15 11:38
阅读 2559·2021-10-27 14:16
阅读 1010·2021-10-18 13:35
阅读 2301·2021-09-30 09:48
阅读 3183·2021-09-29 09:34
阅读 1259·2019-08-30 15:54
阅读 1541·2019-08-27 11:07