我的数据库使用utf8_czech_ci排序规则,我也想将它设置为我的数据库连接.如果我不想要默认值utf8_general_ci,Mysqli_set_charset将不会让我设置排序规则.这里建议先通过mysqli_set_charset设置的字符集,然后通过Set名称设置整理.所以我做了,连接整理仍然是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';");
但是,我只是面临非法混合排序错误.在通过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
as 的值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
,但是比较从表中选择的值和客户端设置的值仍然会抱怨非法混合排序.
详情请参阅我的相关问题.
编辑3:我找到了错误的好方法.我仍然不明白为什么Adminer和Mysqli查询中显示的变量之间存在差异,但我已经在后续问题中提出了这个问题.与我的怀疑不同,最初接受的答案起作用,至少在大多数时间,所以我再次接受它.
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");