【发布时间】:2014-01-05 18:03:28
【问题描述】:
我的数据库使用 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”。这意味着最初接受的答案由于某种神秘的原因而不再起作用。我在 localhost 和托管服务器上都对其进行了测试,甚至在声明数据库之后也进行了测试,因此偶然更改排序规则的错误似乎是不可能的。
那么如何以其他方式更改排序规则?
我以前的代码,出于存档原因:
$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 中的任何一个之后运行它时,我才会在 collation_connection 看到 utf8_czech_ci(有关确切语法,请参阅上面代码的最后几行)。当我从 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 中询问了它。与我的怀疑不同,最初接受的答案至少在大多数情况下有效,所以我再次接受。
【问题讨论】:
标签: php mysql mysqli collation