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

问题描述 投票:5回答:3

我的数据库使用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%";shows collation_connection的值为utf8_general_ci;其他校对变量设置为utf8_czech_ci。当我在Adminer中运行此命令时,只有当我在utf8_czech_cicollation_connection之后运行它时,我才会在SET NAMES看到SET COLLATION_CONNECTION(请参阅上面代码的最后几行以获得确切的语法)。当我从php代码(通过show variables)运行mysqli_query时,它被显示为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
3个回答
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
投票

从PHP文档

这是更改charset的首选方法。建议不要使用mysqli_query()来设置它(例如SET NAMES utf8)。有关更多信息,请参阅MySQL character set concepts section

mkroese在eljakim dot nl评论http://php.net/manual/en/mysqlinfo.concepts.charset.php的重要建议:

请注意,MySQL的utf8编码最多有3个字节,无法编码所有unicode字符。

如果您需要编码超出BMP(基本多语言平面)的字符,如表情符号或其他特殊字符,则需要使用不同的编码,如utf8mb4或支持更高层的任何其他编码。 Mysql将丢弃以4个字节(或更多)编码的任何字符。

有关此事的更多信息,请参见https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb4.html


0
投票

我认为您不能为连接指定特定的排序规则。它也没有意义。无论您选择哪种排序规则,通过连接的字符始终都是相同的。整理对于服务器端的东西,如匹配,订购等生效。

所以你应该没关系utf8

© www.soinside.com 2019 - 2024. All rights reserved.