MySQL/MariaDB中如何支持全部的Unicode( 二 )


Windows下my.ini :
[mysqld]datadir=C:/Program Files/MariaDB 10.3n/dataport=3306character_set_server=utf8mb4# Using unique option prefix 'character_set_client' is error-prone and can break in the future. Please use the full name 'character-set-client-handshake' instead.character-set-client-handshake=utf8mb4# character_set_client=utf8mb4collation-server=utf8mb4_unicode_ciinit_connect='SET NAMES utf8mb4'skip-character-set-client-handshake=falsecharacter_set_filesystem = binarylower_case_table_names=2 [mysqldump]loose_character_set_client=utf8mb4[mysql]default-character-set=utf8mb4[client]port=3306plugin-dir=C:/Program Files/MariaDB 10.3n/lib/plugindefault-character-set=utf8mb4
几个设置项说明:

  • character-set-client-handshake=FALSE 可以影响collation_connection的结果为utf8mb4_unicode_ci,而不是utf8mb4_general_ci 。当然,使用SET collation_connection = utf8mb4_unicode_ci或collation_connection = utf8mb4_unicode_ci也可以 。
  • SET NAMES 指示客户端连接使用的字符集,即向服务器发送 SQL 语句的字符集 。character-set-server 设置服务器字符集 。要正确使用 utf8mb4,需要确保客户端、服务器和连接都设置为 utf8mb4 。
  • init_connect等所有其他有关字符集的默认设置都会继承自character-set-server,也即单独指定init-connect、character_set_client, character_set_results,character_set_connection等都是不必须的 。因此,上面设置中的init_connect可以省略 。
  • 连接的编码值,可以使 MySQL 正确解码输入并对结果进行编码 。否则会在内部重新编码处理 。
纯净的精简的关于utf8mb4字符集和排序规则的设置,如下,只需要5项设置即可:
[client]default-character-set = utf8mb4[mysql]default-character-set = utf8mb4[mysqld]character-set-client-handshake = FALSEcharacter-set-server = utf8mb4collation-server = utf8mb4_unicode_ci
重启MySQL/MariaDB
Linux下使用systemctl restart mariadb或systemctl restart mysqld 。必须使用restart重启(非reload) 。
低版本MariaDB启动或重启的服务名为mysqld(mysqld.service) 。systemctl restart mysqld
Windows下打开“服务”,在服务中找到MariaDB或MySQL对应的服务,右键重启即可 。

再次查看字符集和排序规则
上面的修改重启生效后,再次查看,如下,已经变成为utf8mb4和utf8mb4_unicode_ci 。
MariaDB [(none)]> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' 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|| collation_connection| utf8mb4_unicode_ci || collation_database| utf8mb4_unicode_ci || collation_server| utf8mb4_unicode_ci |+--------------------------+--------------------+10 rows in set (0.008 sec)
character_set_filesystem和character_set_system的说明
上面显示的字符集和排序规则可以看到,有两项并不是utf8mb4 。
  • character_set_filesystem 应该是二进制的,除非你使用的文件系统的文件名中支持多字节 UTF-8 编码字符 。
  • character_set_system 始终是 utf8 并且不能被覆盖 。

关于字符集设置的其他参考
上面的设置已经是正确的修改utf8mb4的设置 。下面将可能的几个相关设置项列出来,供可能的参考(虽然基本用不到):
[client]default-character-set= utf8mb4[mysql]default-character-set= utf8mb4[mysqld]explicit_defaults_for_timestamp= 1 # Posting it here as a tip to disable the Timestamp message, maybe it can help someone :)character-set-client-handshake= 0 # FALSEinit_connect= 'SET character_set_system = utf8mb4'init_connect= 'SET character_set_connection = utf8mb4'init_connect= 'SET character_set_database = utf8mb4'init_connect= 'SET character_set_results = utf8mb4'init_connect= 'SET collation_database = utf8mb4_unicode_ci'init_connect= 'SET collation_connection = utf8mb4_unicode_ci'init_connect= 'SET NAMES utf8mb4'character-set-server= utf8mb4#character_set_client= utf8mb4collation-server= utf8mb4_unicode_cicollation_connection= utf8mb4_unicode_cicollation_database= utf8mb4_unicode_ci
多个init_connect也可以这样设置:init_connect = 'SET collation_connection = utf8mb4_unicode_ci,NAMES utf8mb4' 。未验证
现有数据库切换字符集到utf8mb4的完整过程
如果数据库创建之初就是utf8mb4,则就没有这些烦心事了!!!
第 1 步:创建备份
创建要升级的服务器上所有数据库的备份 。安全第一!
第 2 步:升级MySQL服务器
将 MySQL 服务器升级到 v5.5.3+ 。MySQL升级到8.0就不用第5步MySQL服务器字符集的修改了,默认就是utf8mb4 。MariaDB还需要修改字符集 。

推荐阅读