我遇到了一个问题,即在使用 PHP 与命令行进行查询时,我得到的结果顺序不同。根据我的研究,在某些情况下,错误的编码似乎会导致结果顺序出现问题。
也就是说,我所有的数据库表都编码为utf8mb4,并带有 collation utf8mb4_general_ci。但是,似乎没有正确设置 mysql 变量。
我在 Mysql 5.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_ci
Run Code Online (Sandbox Code Playgroud)
mysql 输出的变量:
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
Run Code Online (Sandbox Code Playgroud)
更新:有人询问我如何连接到数据库:
$this->connection = new PDO('mysql:host='.DB_SERVER.';dbname='.DB_NAME.';port='.DB_PORT, DB_USER, DB_PASS, $options);
Run Code Online (Sandbox Code Playgroud)
更新:我已经切换到utf8mb4_unicode_ci(根据下面答案中的建议)。
您还想拥有character-set-client-handshake = FALSE。
和 /etc/my.cnf.d/character-set.cnf
# https://scottlinux.com/2017/03/04/mysql-mariadb-set-character-set-and-collation-to-utf8/
# https://mariadb.com/kb/en/library/setting-character-sets-and-collations/
# https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434
# /sf/ask/3329671131/
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
collation-server = utf8mb4_unicode_ci
init-connect = 'SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'
character-set-server = utf8mb4
Run Code Online (Sandbox Code Playgroud)
我得到的一切都是 utf8mb4 1
MariaDB [(none)]> show variables like 'char%'; show variables like 'collation%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)
MariaDB [(none)]>
Run Code Online (Sandbox Code Playgroud)
但是,如果没有字符集客户端握手行,有些仍然是 utf8
MariaDB [(none)]> show variables like 'char%'; show variables like 'collation%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| 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 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.01 sec)
MariaDB [(none)]>
Run Code Online (Sandbox Code Playgroud)
1 character_set_system总是 utf8。
您可能应该使用 utf8mb4_unicode_ci 而不是 utf8mb4_general_ci,因为它更准确。除非您在 CPU 较旧/有限的系统上运行 MariaDB,否则性能是一个巨大的问题。
init_connect话虽这么说,解决方案是在 MariaDB 配置中设置(或--init-connect在命令行上):
init_connect = "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"
Run Code Online (Sandbox Code Playgroud)
无论哪种方式都可以。我并不是推荐一种方法而不是另一种方法。两者都是同样有效的方法。
您的 MariaDB 配置可能位于 my.cnf 或 my.cnf 包含的文件中,通常位于 /etc/mysql 下。检查您的系统文档以了解详细信息。因为您正在配置服务器变量,如上面链接的 MariaDB 文档所示,所以您应该在配置文件的服务器部分设置该变量。配置文件的服务器部分由以“d”结尾的 INI 节名称指示。INI 节由方括号括起来的关键字表示,例如“[section]”。“d”代表“daemon”,它是服务器进程的标准 UNIX 术语。[mysqld]您可以在节或节中设置变量[mariadb]。因为init_connect服务器变量对于 MySQL 和 MariaDB 都是通用的,所以我建议您将其放在[mysqld].
我看到您正在character_set_client=utf8mb4粘贴的配置中进行设置。你不需要这样做。您可以删除或注释掉该行。注释是以井号 ( #) 开头的行,也称为哈希标记、octothorp 或数字符号。
连接到服务器的所有客户端都将在处理任何其他命令之前执行这些命令。
| 归档时间: |
|
| 查看次数: |
14881 次 |
| 最近记录: |