我的数据库使用 utf8_czech_ci 排序规则,我也想将它设置为我的数据库连接。 Mysqli_set_charset 不会让我设置排序规则,如果我不想要默认的排序规则,utf8_general_ci。 Here建议首先通过 mysqli_set_charset 设置字符集,然后通过 SET NAMES 设置排序规则。所以我做到了,连接排序规则仍然是 utf8_general_ci。
编辑:现在我基本上使用代码 YourCommonSense建议:
$spojeni=mysqli_connect('mysql01','username','password', 'my_database');
if (!$spojeni) die('Nepodařilo se připojit k databázi.');
mysqli_set_charset($spojeni,'utf8');
mysqli_query($spojeni, "SET COLLATION_CONNECTION = 'utf8_czech_ci';");
然而,我刚刚遇到了Illegal mix of collations错误。在通过 mysqli_get_charset()
测试我的连接排序规则时,我发现我的排序规则是“utf8_general_ci”,而不是它应该的“utf8_czech_ci”。这意味着最初接受的答案由于某种神秘原因而停止工作。我在本地主机和托管服务器上都对其进行了测试,甚至在声明数据库之后也进行了测试,因此偶然更改排序规则的错误似乎是不可能的。
那么如何以其他方式更改排序规则呢?
我以前的代码,出于存档原因:
$spojeni=mysqli_connect('mysql01','username','password');
if (!$spojeni) die('Nepodařilo se připojit k databázi.');
mysqli_query($spojeni, "USE my_database");
mysqli_set_charset($spojeni,'utf8');
mysqli_query($spojeni, "SET NAMES 'utf8' COLLATE 'utf8_czech_ci';");
EDIT2:show variables like "%collation%";
将 collation_connection
的值显示为 utf8_general_ci
;其他排序规则变量设置为 utf8_czech_ci
。在 Adminer 中运行此命令时,只有在 SET NAMES
或 SET COLLATION_CONNECTION
(请参阅上面我的代码的最后几行以了解确切的语法)。当我从 php 代码(通过 mysqli_query
)运行 show variables
时,它显示为 utf8_czech_ci
,但是比较从表中选择的值和客户设置的值仍然提示 illegal mix of collations .
详情在我的related question .
EDIT3:我找到了a good workaround for the errors .我仍然不明白为什么 Adminer 和 Mysqli 查询中显示的变量之间存在差异,但我已经在 follow-up question 中要求过它.与我的怀疑不同,最初接受的答案至少在大多数情况下是有效的,所以我再次接受它。
最佳答案
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli=mysqli_connect('mysql01','username','password', 'my_database');
$mysqli->set_charset('utf8mb4');
// setting collation is optional and not needed 99% of time
// only if you need a specific one, like in this case
$mysqli->query("SET collation_connection = utf8mb4_czech_ci");
关于php - 如何使用 mysqli 设置排序规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20643255/