如何使用mysqli设置排序规则?

时间:2013-12-17 19:44:00

标签: php mysql mysqli collation

我的数据库使用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_cicollation_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中要求它。与我的怀疑不同,最初接受的答案至少在大部分时间都有效,所以我再次接受它。

3 个答案:

答案 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没问题。