我的数据库使用utf8_czech_ci排序规则,我也想将它设置为我的数据库连接。如果我不想要默认值utf8_general_ci,Mysqli_set_charset将不会让我设置排序规则。首先建议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中运行此命令时,只有在utf8_czech_ci
或collation_connection
之后运行SET NAMES
时,我才会在SET COLLATION_CONNECTION
看到show variables
(请参阅上面代码的最后几行以获取确切的语法)。当我从php代码(通过mysqli_query
)运行utf8_czech_ci
时,它显示为{{1}},但是比较从表中选择的值和客户端设置的值仍会抱怨{ {3}}
我的illegal mix of collations详细信息。
EDIT3:我找到了related question。我仍然不明白为什么Adminer和Mysqli查询中显示的变量之间存在差异,但我已经在a good workaround for the errors中要求它。与我的怀疑不同,最初接受的答案至少在大部分时间都有效,所以我再次接受它。
答案 0 :(得分:9)
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli=mysqli_connect('mysql01','username','password', 'my_database');
mysqli->set_charset('utf8');
mysqli->query("SET collation_connection = utf8_czech_ci");
答案 1 :(得分:1)
从php文档
这是更改字符集的首选方法。 不建议使用here进行设置(例如SET NAMES utf8)。有关详细信息,请参见mysqli_query()。
mkroese在eljakim点nl的MySQL character set concepts section的评论中提供了重要建议:
请注意,MySQL的utf8编码最大为3个字节, 无法编码所有 Unicode字符。
如果您需要对超出BMP(基本多语言)的字符进行编码 平面),例如表情符号或其他特殊字符,则需要使用 utf8mb4等不同的编码或其他支持 更高的飞机。 MySQL将丢弃任何编码为4字节的字符 (或更多)。
请参阅 http://php.net/manual/en/mysqlinfo.concepts.charset.php 有关此事的更多信息
答案 2 :(得分:0)
我不认为你可以为连接指定特定的排序规则。它也没有意义。无论您选择哪种排序规则,通过连接的字符始终都是相同的。整理对于服务器端的东西如匹配,排序等生效。
所以你应该对utf8
没问题。