我很难理解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)当我在collation_connection文件中指定utf8_unicode_ci时,为什么要将utf8_unicode_ci设置为my.cnf?
2)为什么,当我创建表时,默认的排序规则是utf8_general_ci?
我很难理解这些排序规则变量是如何解释和使用的。
发布于 2016-11-20 10:41:21
几个字符集和排序系统变量与客户端与服务器的交互有关。
服务器使用character_set_connection和collation_connection系统变量,然后将客户端发送的语句从character_set_client转换为character_set_connection (除了具有介绍器(如_latin1或_utf8)的字符串文字)。collation_connection是比较文字字符串的重要。对于字符串与列值的比较,collation_connection并不重要,因为列有自己的排序规则,它具有较高的排序规则优先级。
关于第二个问题--如果数据库字符集和排序规则在CREATE DATABASE语句中没有指定,则使用服务器字符集和排序规则作为默认值。没有其他目的.您必须确保数据库字符集在创建时就设置好了(或者,您以后可以用ALTER DATABASE database_name CHARACTER SET utf8 COLLATE utf8_unicode_ci;更改它)。
发布于 2016-11-20 18:57:08
另一种处理字符集的方法。(这绕过了提出的问题,提供了一个“最佳做法”)。
SET NAMES。CHARACTER SET和所需的COLLATION。这将建立存储在列中的编码。通常,在CREATE TABLE上指定这些内容并让列继承这些内容就足够了。(该表默认为数据库,默认为character_set_server,但依赖于这棵默认值树可能是不明智的。)SET NAMES准确地设置了这三个“变量”:
character_set_client
character_set_connection
character_set_results将它们看作是表示客户机中存在什么编码,而不管每个列上存在什么CHARACTER SET。转换将根据需要在INSERT和SELECT上进行。
(这个答案不应与@bodi0冲突。)
https://stackoverflow.com/questions/40699873
复制相似问题