所以我的目标是将所有字符集和排序规则设置为
utf8
和 utf8_unicode_ci
。
我使用 AWS RDS 来托管 MySQL 服务器。
我已在 RDS 的参数组中将
collation_connection variable
设置为 utf8_unicode_ci
。
.
然后我重新启动了 RDS,当进入 MySQL 控制台时,它显示了以下变量值。
mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+-------------------------------------------+
| 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 | /rdsdbbin/mysql-5.6.22.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.01 sec)
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
我不确定为什么
collation_connection
设置为 utf8_general_ci
您在此处看到的变量是当前客户端会话的变量:
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
因此,当您启动连接时,您需要在要连接的客户端上运行以下命令:
SET collation_connection = 'utf8_unicode_ci';
collation_connection
变量由客户端设置;客户端可能会使用不同的设置进行编译 - 在这种情况下, utf8
的默认排序规则似乎是 utf8_general_ci
。
问题是MySQL客户端允许用户设置字符集(
default-character-set
),但不允许设置排序规则。如果需要特定的排序规则,则无法直接解决此问题。
在这种情况下,可以做的(除了运行时更改之外)是将服务器
character-set-client-handshake
变量设置为关闭 (0
)。
这将跳过与客户端的字符集(以及隐式的排序规则)协商,并将服务器字符集/排序规则设置强加于任何客户端连接。
在参数组中,将变量 init_connect 设置为
设置 COLLATION_CONNECTION=utf8_unicode_ci
我做到了 -
/etc/mysql/mariadb.conf.d/50-server.cnf
中规定
character-set-client-handshake = FALSE
我不知道/不明白这两个参数(—skip ... 和 FALSE)有多相同,但如果它们相同,那么在官方文档中会这样写
Don't ignore client side character set value sent during handshake. (Defaults to on; use --skip-character-set-client-handshake to disable.)
另外在文档中,我没有找到任何有关该值的内容
但它有效。
如果您有任何具有不同
CHARACTER SET
或 COLLATION
的现有表格,则它们需要转换;参见ALTER TABLE ... CONVERT TO ...
。
如果您的代码未按
utf8
连接,则需要更改。细节是非常特定于语言的(Java vs PHP vs ...)。
并且,如果您正在制作 html 页面,则需要从
开始<meta charset=UTF-8>
只要你在做这个练习,你就应该一直做下去,这样你就可以处理所有的中文和表情符号:
utf8mb4
和utf8mb4_unicode_520_ci
。