MySql上的错误消息:
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
Run Code Online (Sandbox Code Playgroud)
我已经经历了其他几个帖子,但无法解决这个问题.受影响的部分与此类似:
CREATE TABLE users (
userID INT UNSIGNED NOT NULL AUTO_INCREMENT,
firstName VARCHAR(24) NOT NULL,
lastName VARCHAR(24) NOT NULL,
username VARCHAR(24) NOT NULL,
password VARCHAR(40) NOT NULL,
PRIMARY KEY (userid)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE products (
productID INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(104) NOT NULL,
picturePath VARCHAR(104) NULL,
pictureThumb VARCHAR(104) NULL,
creationDate DATE NOT NULL,
closeDate DATE NULL,
deleteDate DATE NULL, …Run Code Online (Sandbox Code Playgroud) 刚刚从上一个问题得到了这个答案,它有效!
SELECT username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount
FROM ratings WHERE month='Aug' GROUP BY username HAVING TheCount > 4
ORDER BY TheAverage DESC, TheCount DESC
Run Code Online (Sandbox Code Playgroud)
但当我坚持这个额外的位时,会出现这个错误:
文档#1267 - 操作'='的非法混合排序(latin1_swedish_ci,IMPLICIT)和(latin1_general_ci,IMPLICIT)
SELECT username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount FROM
ratings WHERE month='Aug'
**AND username IN (SELECT username FROM users WHERE gender =1)**
GROUP BY username HAVING TheCount > 4 ORDER BY TheAverage DESC, TheCount DESC
Run Code Online (Sandbox Code Playgroud)
该表是:
id, username, rating, month
我的数据库使用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';");
Run Code Online (Sandbox Code Playgroud)
但是,我只是面临非法混合排序错误.在通过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';");
Run Code Online (Sandbox Code Playgroud)
EDIT2:show variables like "%collation%";显示collation_connectionas 的值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,但是比较从表中选择的值和客户端设置的值仍然会抱怨非法混合排序.
详情请参阅我的 …