我使用PHP 8.1和MySQL 8.0。所有数据库、表和单个字段都设置为utf8mb4_0900_ai_ci
排序规则-数据库除外:information_schema和performance_schema,它们是utf8mb3_general_ci
(系统默认值?).
以下是用于排序规则和字符集的全局变量MySQL configs:
//performance_schema.global_variables
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 utf8mb3
collation_connection utf8mb4_0900_ai_ci
collation_database utf8mb4_0900_ai_ci
collation_server utf8mb4_0900_ai_ci
default_collation_for_utf8mb4 utf8mb4_0900_ai_ci
如您所见,我正在尝试将服务器设置为字符集为utf8mb4
,排序规则为utf8mb4_0900_ai_ci
(这是MySQL 8.0推荐的)
performance_schema.session_variables有一组稍微不同的变量,我不确定这是否有区别。我尝试重新启动MySQL,但是会话变量没有更新到上面设置的全局变量。我尝试手动更改这些,但它们不会更改,即使我使用MySQL admin用户:
//performance_schema.session_variables
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb3
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8mb3
collation_connection utf8mb4_0900_ai_ci
collation_database utf8mb3_general_ci
collation_server utf8mb4_0900_ai_ci
default_collation_for_utf8mb4 utf8mb4_0900_ai_ci
下面是我连接到MySQL并打印字符集数据的脚本:
$conn = mysqli_connect($hostname, $username, $password, $database);
mysqli_set_charset($conn,"utf8mb4");
mysqli_query($conn, "SET collation_connection = 'utf8mb4_0900_ai_ci'");
mysqli_query($conn, "SET SESSION collation_connection = 'utf8mb4_0900_ai_ci'");
var_dump(mysqli_get_charset($conn));
//
object(stdClass)#2 (8) {
["charset"]=> string(7) "utf8mb4"
["collation"]=> string(18) "utf8mb4_general_ci"
["dir"]=> string(0) ""
["min_length"]=> int(1)
["max_length"]=> int(4)
["number"]=> int(45)
["state"]=> int(1)
["comment"]=> string(13) "UTF-8 Unicode"
}
问题是“排序规则”显示的是utf8mb4_general_ci
,但它应该是utf8mb4_0900_ai_ci
。我已经阅读了各种指南在这里,我无法解决这个问题。有谁知道如何正确地做这件事吗?
2条答案
按热度按时间djmepvbi1#
您已正确设置排序规则。您在
mysqli_get_charset
中看到的信息是不相关的。尝试:
你会看到正确的排序。
我不确定,但我认为mysqlnd没有办法弄清楚实际使用的是哪个排序规则。您只能设置字符集,但不能设置排序规则,因此它将始终报告默认排序规则。但这对mysqlnd来说并不重要,因为PHP不使用排序规则。你可以像现在这样安全地设置它。
e5nszbig2#
归类属于数据库。
ALTER DATABASE
database
/*!40100 DEFAULT COLLATE latin2_hungarian_ci */;对我来说没问题
你可以在这里找到排序规则:
https://mariadb.com/kb/en/setting-character-sets-and-collations/