我的数据库使用 utf8_czech_ci 排序规则,我也想将其设置为我的数据库连接。如果我不想要默认的 utf8_general_ci,Mysqli_set_charset 不会让我设置排序规则。Here https://bugs.php.net/bug.php?id=52267建议首先通过 mysqli_set_charset 设置字符集,然后通过 SET NAMES 设置排序规则。所以我这样做了,连接排序规则仍然是utf8_general_ci。
编辑:现在我基本上使用代码你的常识 https://stackoverflow.com/a/20643631/1801588建议:
$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';");
然而我刚刚面对非法的排序规则组合 https://stackoverflow.com/q/1008287/1801588错误。通过测试我的连接排序规则时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
as utf8_general_ci
;其他排序规则变量设置为utf8_czech_ci
。在管理员中运行此命令时,我看到utf8_czech_ci
at collation_connection
仅当我在以下任一之后运行它时SET NAMES
or SET COLLATION_CONNECTION
(有关确切的语法,请参阅上面代码的最后几行)。当我跑步时show variables
来自 php 代码(通过mysqli_query
),则证明为utf8_czech_ci
,但是比较从表中选择的值和客户端设置的值仍然会抱怨非法混合排序规则 https://stackoverflow.com/q/3029321/1801588.
详细详情在我的相关问题 https://stackoverflow.com/q/28873538/1801588.
编辑3:我发现一个很好的错误解决方法 https://stackoverflow.com/a/28893929/1801588。我仍然不明白为什么 Adminer 和 Mysqli 查询中显示的变量之间存在差异,但我已经在后续问题 https://stackoverflow.com/q/28873538/1801588。与我的怀疑不同,最初接受的答案至少在大多数情况下有效,所以我再次接受它。