我在理解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?
我很难理解如何解释和使用这些校对变量。
答案 0 :(得分:2)
多个字符集和整理系统变量与客户端与服务器的交互有关。
服务器使用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;
更改<) / p>
答案 1 :(得分:0)
另一种接近字符集的方式......(这绕过了提出的问题并提供了最佳实践&#39;。)
SET NAMES
。CHARACTER SET
,并且可选地包含所需的COLLATION
。这将建立存储在列中的编码。通常在CREATE TABLE
上指定这些并让列继承它就足够了。 (该表默认为数据库,默认为character_set_server
,但依赖于此默认树,这可能令人困惑,也许是不明智的。) SET NAMES
正好设置了这三个变量&#39;:
character_set_client
character_set_connection
character_set_results
将它们视为客户端中存在哪种编码,无论每列上存在CHARACTER SET
。转换将根据需要在INSERT
和SELECT
上进行。
(这个答案不应与@ bodi0&#39; s相冲突。)