我遇到了一个问题,在使用PHP和命令行进行查询时,我得到了不同的排序结果。从我的研究来看,在某些情况下,错误的编码可能会导致结果的顺序出现问题。
尽管如此,我的所有DB表都被编码为utf8mb4,并使用排序规则utf8mb4_general_ci。但是,mysql变量的设置似乎并不正确。
我正在使用MySQL5.5.5-10.1.26-MariaDB。
这是我的CNF设置,但老实说,我不知道我在这里做什么:
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mariadb]
[mysqld]
character-set-server=utf8mb4
character_set_client=utf8mb4
collation-server=utf8mb4_general_cimysql输出的变量:
character_set_client utf8
character_set_connection utf8
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8
character_set_server utf8mb4
character_set_system utf8
collation_connection utf8_general_ci
collation_database utf8mb4_unicode_ci
collation_server utf8mb4_general_ci更新:有人问我如何连接数据库:
$this->connection = new PDO('mysql:host='.DB_SERVER.';dbname='.DB_NAME.';port='.DB_PORT, DB_USER, DB_PASS, $options);更新:我切换到了utf8mb4_unicode_ci (如下所示)。
发布于 2017-11-30 06:08:44
您可能应该使用utf8mb4_unicode_ci而不是utf8mb4_general_ci,因为它更准确。除非您在一个具有旧的/有限的CPU和性能的系统上运行MariaDB,这是一个非常值得关注的问题。
尽管如此,解决方案是在您的init_connect配置中设置MariaDB (或命令行上的--init-connect ):
init_connect = "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"两种方法都行。我不是在推荐一种方式而另一种方式。两者都是同样有效的方法。
您的MariaDB配置可能位于my.cnf或my.cnf包含的文件中,通常在/etc/mysql下面找到。有关详细信息,请查看系统文档。由于您正在配置服务器变量,如上面链接的MariaDB文档所示,您应该在配置文件的服务器部分中设置该变量。配置文件的服务器部分由以"d“结尾的INI节名称表示。INI部分由方括号包围的关键字表示,例如“节”。"d“代表”守护进程“,这是服务器进程的标准UNIX名称。可以在[mysqld]节或[mariadb]节中设置变量。因为init_connect服务器变量对MySQL和MariaDB都是通用的,所以我建议将其放在[mysqld]下面。
我看到您在粘贴配置中设置了character_set_client=utf8mb4。你不需要这么做。您可以删除或注释掉该行。注释是以磅符号(#)开头的行,也称为散列标记、八进制或数字符号。
连接到服务器的任何和所有客户端将在处理任何其他命令之前执行这些命令。
发布于 2017-12-01 00:34:56
init_connect不是由任何与root连接的人执行的,因此它并不像您所希望的那样具有普遍性。
SET NAMES utf8mb4设置了三种东西:实验来观察。你需要全部三个。
如果您没有追溯到5.5,我建议utf8mb4_unicode_520_ci是一个更好的排序规则:"Unicode排序规则名称现在可能包含一个版本号,以指示该排序规则所基于的Unicode排序规则算法( UCA )版本。因此,初始排序规则创建了UCA5.2.0版本。例如,utf8_unicode_520_ci基于UCA5.2.0。基于UCA的Unicode排序规则名称不包含版本号是基于4.0.0版本的。“
版本8.0有Unicode 9.0标准。
回到这个问题上:没有完美的解决方案;用户可以通过无知或恶意覆盖您所做的任何事情。
您可以管理创建的表,但这不会阻止它们不正确地连接。或者是正确的,但是有一个不同的字符集。执行SET NAMES latin1,然后提供latin1 1编码字节是有效的。MySQL将在存储/获取时进行转换。
但是,如果它们有utf8 8编码的字节,但如果使用SET NAMES latin1,则会得到“双重编码”。这个"bug“破坏了任何正确排序的机会,但通常是透明的。也就是说,当东西被储存的时候,它就会被弄乱,然后当它被取出来的时候,就不会被弄乱。
发布于 2018-07-10 08:13:01
若要修复此警告,应编辑
/etc/my.cnf (my.ini on Windows)只需在文件中添加/设置
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
collation-server=utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
character-set-server=utf8mb4https://stackoverflow.com/questions/47566730
复制相似问题