collat​​ion_server和默认charset / collat​​ion mysql之间的区别

时间:2016-11-20 01:53:37

标签: mysql utf-8 collation

我在理解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时,为什么collat​​ion_connection设置为utf8_general_ci?

2)为什么我创建表时是默认的排序规则utf8_general_ci?

我很难理解如何解释和使用这些校对变量。

2 个答案:

答案 0 :(得分:2)

多个字符集和整理系统变量与客户端与服务器的交互有关。

服务器使用character_set_connectioncollation_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;。)

  • 连接到数据库时,使用客户端的connect参数来声明客户端中字节的编码。或者,在连接后执行SET NAMES
  • 确保每列都包含所需的CHARACTER SET,并且可选地包含所需的COLLATION。这将建立存储在列中的编码。通常在CREATE TABLE上指定这些并让列继承它就足够了。 (该表默认为数据库,默认为character_set_server,但依赖于此默认树,这可能令人困惑,也许是不明智的。)

SET NAMES正好设置了这三个变量&#39;:

character_set_client
character_set_connection
character_set_results

将它们视为客户端中存在哪种编码,无论每列上存在CHARACTER SET。转换将根据需要在INSERTSELECT上进行。

(这个答案不应与@ bodi0&#39; s相冲突。)