我很难理解 my.cnf 设置和实际数据库设置之间的逻辑差异。
例如,我的 my.cnf 有以下内容:
init_connect = 'SET collation_connection=utf8_unicode_ci'
init_connect = 'SET NAMES utf8'
character-set-server = utf8
collation-server = utf8_unicode_ci
当我登录数据库而不指定架构时,我会看到以下排序规则变量集:
mysql> show variables like '%coll%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
我有几个问题:
1) 当我在 my.cnf 文件中指定 utf8_unicode_ci 时,为什么 collation_connection 设置为 utf8_general_ci?
2)为什么我创建表时默认的排序规则是utf8_general_ci?
我很难理解这些排序规则变量是如何解释和使用的。
最佳答案
多个字符集和排序规则系统变量与客户端与服务器的交互相关。
服务器使用 character_set_connection
和 collation_connection
系统变量,然后将客户端发送的语句从 character_set_client
转换为 character_set_connection
(除了具有引导符的字符串文字,例如 _latin1 或 _utf8)。 collation_connection
对于文字字符串的比较非常重要。对于字符串与列值的比较,collation_connection
并不重要,因为列有自己的排序规则,具有更高的排序规则优先级。
关于第二个问题 - 如果在 CREATE DATABASE
语句中未指定数据库字符集和排序规则,则服务器字符集和排序规则将用作默认值。 他们have no other purpose . 您必须确保在创建数据库时就设置了数据库字符集(或者,您当然可以稍后使用 ALTER DATABASE database_name CHARACTER SET utf8 COLLATE utf8_unicode_ci; 来更改它) )
关于mysql - collation_server 和默认字符集/排序规则 mysql 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40699873/