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

Php 如何使用mysqli设置排序规则?,php,mysql,mysqli,collation,Php,Mysql,Mysqli,Collation,我的数据库使用utf8_捷克_ci排序规则,我想将其设置为我的数据库连接。如果我不想使用默认的utf8\u general\u ci,Mysqli\u set\u charset将不允许我设置排序规则。建议首先通过mysqli_set_charset设置字符集,然后通过集合名称设置排序规则。所以我做了,连接排序仍然是utf8\u general\u ci 编辑:现在我基本上使用建议的代码: $spojeni=mysqli_connect('mysql01','username','passw

我的数据库使用utf8_捷克_ci排序规则,我想将其设置为我的数据库连接。如果我不想使用默认的utf8\u general\u ci,Mysqli\u set\u charset将不允许我设置排序规则。建议首先通过mysqli_set_charset设置字符集,然后通过集合名称设置排序规则。所以我做了,连接排序仍然是utf8\u general\u ci

编辑:现在我基本上使用建议的代码:

  $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';");
然而,我只是面临着错误。通过
mysqli\u get\u charset()
测试我的连接排序规则时,我发现我的排序规则是“utf8\u general\u ci”,而不是应该的“utf8\u checker\u ci”。这意味着最初被接受的答案由于某种神秘的原因停止了工作。我在localhost和hosted server上测试了它,甚至在声明数据库之后也测试了它,所以偶然地改变排序规则的一些错误似乎是不可能的

那么,如何以其他方式更改排序规则呢

我以前的代码,出于存档原因:

  $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:
显示变量,如“%collation%”
排序规则连接的值显示为
utf8\u常规\u ci
;其他排序规则变量设置为
utf8\u捷克语\u ci
。在Adminer中运行此命令时,仅当我在任何
设置名称
设置排序规则
后运行它时,我才会在
排序规则连接
处看到
utf8\u捷克语
(有关确切语法,请参见上面代码的最后几行)。当我从php代码运行
show variables
(通过
mysqli_query
)时,它显示为
utf8_捷克_ci
,但是比较从表中选择的值和客户机设置的值仍然会抱怨

详情请参阅我的

EDIT3:我找到了。我仍然不明白为什么Adminer和Mysqli查询中显示的变量之间会有差异,但我已经在。与我的怀疑不同,最初接受的答案至少在大多数情况下有效,因此我再次接受它。

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


因此,您应该可以使用php文档中的
utf8

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");
这是更改字符集的首选方法不建议使用设置(如设置名称utf8)。有关详细信息,请参阅

来自eljakim dot nl的mkroese评论的一条重要建议:

请注意,MySQL的utf8编码最大为3个字节,并且 无法对所有unicode字符进行编码

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

看 了解更多关于此事的信息


它抛出了一个错误,所以我找到了正确的解决方案,测试了它的工作原理,并编辑了您的代码。不管怎样,你的回答引导我找到了答案,所以+1并接受了。是的,我忘记了=符号。现在它起作用了。您应该只使用正确的命令,而不是像另一个答案中所示的那样,对一些难以理解其含义的查询发出垃圾邮件。这个答案似乎不再有效。请参阅我的问题编辑。排序规则\u连接对于文字字符串的比较很重要。对于具有列值的字符串的比较,排序规则\u连接无关紧要