【问题标题】:How to set a collation with mysqli?如何使用 mysqli 设置排序规则?
【发布时间】: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 NAMESSET 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


    【解决方案1】:
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli=mysqli_connect('mysql01','username','password', 'my_database');
    $mysqli->set_charset('utf8mb4');
    // setting collation is optional and not needed 99% of time
    // only if you need a specific one, like in this case
    $mysqli->query("SET collation_connection = utf8mb4_czech_ci");
    

    【讨论】:

    • 它抛出了一个错误,所以我找到了正确的解决方案here,测试了它是否有效,并编辑了你的代码。无论如何,您的回答引导我找到解决方案,因此 +1 并接受了。
    • 是的,我忘了 = 符号。现在它起作用了。您应该只使用正确的命令,而不是仅仅使用一些几乎不理解其含义的查询的垃圾邮件,如其他答案所示。
    • 这个答案似乎不再有效。请参阅我的问题编辑。
    【解决方案2】:

    来自 php 文档

    这是更改字符集的首选方法。 不推荐使用mysqli_query()进行设置(如SET NAMES utf8)。更多信息请参见MySQL character set concepts section

    来自 eljakim dot nl 的 mkroese 的 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 有关此事的更多信息

    【讨论】:

      【解决方案3】:

      我认为您可以为连接指定特定的排序规则。这也没有意义。无论您选择哪种排序规则,通过连接的字符将始终相同。排序规则对匹配、排序等服务器端内容生效。

      所以utf8 应该没问题。

      【讨论】:

      猜你喜欢
      • 2012-08-25
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 2011-09-26
      • 1970-01-01
      • 2021-12-03
      相关资源
      最近更新 更多