php mysqli_get_charset显示错误的排序规则-如何更新?

0kjbasz6  于 2023-05-16  发布在  PHP
关注(0)|答案(2)|浏览(104)

我使用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。我已经阅读了各种指南在这里,我无法解决这个问题。有谁知道如何正确地做这件事吗?

djmepvbi

djmepvbi1#

您已正确设置排序规则。您在mysqli_get_charset中看到的信息是不相关的。
尝试:

var_dump($conn->query("SELECT @@collation_connection")->fetch_column());

你会看到正确的排序。
我不确定,但我认为mysqlnd没有办法弄清楚实际使用的是哪个排序规则。您只能设置字符集,但不能设置排序规则,因此它将始终报告默认排序规则。但这对mysqlnd来说并不重要,因为PHP不使用排序规则。你可以像现在这样安全地设置它。

e5nszbig

e5nszbig2#

归类属于数据库。
ALTER DATABASE database /*!40100 DEFAULT COLLATE latin2_hungarian_ci */;
对我来说没问题
你可以在这里找到排序规则:
https://mariadb.com/kb/en/setting-character-sets-and-collations/

相关问题