MySql 中的非法混合排序规则错误
Posted
技术标签:
【中文标题】MySql 中的非法混合排序规则错误【英文标题】:Illegal mix of collations error in MySql 【发布时间】:2010-11-17 12:44:33 【问题描述】:刚刚从上一个问题中得到了这个答案,它很有效!
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
但是当我把这个额外的位插入它时会出现这个错误:
文档 #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
表格是:
id, username, rating, month
【问题讨论】:
这能回答你的问题吗? Illegal mix of collations mysql Error 【参考方案1】:您需要为每个函数中的所有参数设置“utf8”。这是我的情况:
【讨论】:
【参考方案2】:就我而言,这很奇怪。我从文件中读取 api 密钥,然后将其发送到进行 SQL 查询的服务器。问题是 Windows 记事本留下的 BOM 字符,它导致错误提示:
SQLSTATE[HY000]:一般错误:1267 非法混合排序规则 (latin1_swedish_ci,IMPLICIT) 和 (utf8_general_ci,COERCIBLE) 用于操作 '='
我刚刚删除了它,一切都像魅力一样运作
【讨论】:
【参考方案3】:我遇到这个问题不是因为我存储在不同的排序规则中,而是因为我的列类型是 JSON,它是二进制的。
这样修复它:
select table.field COLLATE utf8mb4_0900_ai_ci AS fieldName
【讨论】:
【参考方案4】:在 Bagisto 中创建类别时出现非法的排序规则组合。运行这些命令(谢谢@Quy Le)为我解决了这个问题:
--设置 utf8 进行连接
SET collation_connection = 'utf8_general_ci'
--将DB的CHARACTER SET改为utf8
ALTER DATABASE dbName CHARACTER SET utf8 COLLATE utf8_general_ci
--更改类别表
ALTER TABLE categories CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
ALTER TABLE category_translations CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
【讨论】:
【参考方案5】:[MySQL]
在这些(非常罕见的)情况下:
两个表确实需要不同的排序规则类型值不是来自表,而是来自显式枚举,例如:
SELECT 1 AS numbers UNION ALL SELECT 2 UNION ALL SELECT 3
您可以使用 CAST 或 CONVERT 比较不同表之间的值:
CAST('my text' AS CHAR CHARACTER SET utf8)
CONVERT('my text' USING utf8)
在 MySQL 网站上查看 CONVERT and CAST documentation。
【讨论】:
它们并不罕见,我经常在我们的多语言网站上找到它们。 我在使用curtime()
、SELECT * FROM t_eoms_shift WHERE start_time <= curtime() AND end_time >= curtime();
进行此查询时遇到了这个问题。这应该是一个未解决的错误,已解决 here。在我用CONVERT()
将过程调用修饰为SELECT * FROM t_eoms_shift WHERE start_time <= convert(curtime() USING utf8) AND end_time >= convert(curtime() USING utf8);
这是对我的情况最有用的答案。我用where view_column_name = 'available'
查询视图时遇到了这个问题,添加CONVERT('available' USING utf8mb4)
修复了它!【参考方案6】:
我也遇到了同样的错误,但在我的情况下,主要问题是在 where 条件下,我正在检查的参数有一些未知的隐藏字符 (+%A0 )
当 A0 转换时,我得到 160,但 160 超出了 db 知道的字符范围,这就是为什么数据库无法将其识别为字符的原因 其他东西是我的表列是 varchar
我所做的解决方案是我检查了一些类似的字符并在运行 sql 命令之前删除这些字符
例如:- preg_replace('/\D/', '', $myParameter);
【讨论】:
【参考方案7】:对于从 0 到 1 设置的字段的集合警告,我遇到了同样的问题。所有列集合都是相同的。我们尝试再次更改集合,但没有解决此问题。
最后我们将字段更新为NULL
,然后我们更新为1,这样就解决了收集问题。
【讨论】:
【参考方案8】:如果你想避免改变语法来解决这个问题,试试这个:
将您的 MySQL 更新到 5.5 或更高版本。
这为我解决了问题。
【讨论】:
这可能不是真的。我有 5.6.35 版,但仍然出现此错误【参考方案9】:尽可能使用 ascii_bin,它几乎可以匹配任何排序规则。 无论如何,用户名很少接受特殊字符。
【讨论】:
【参考方案10】:主要是这里的问题,只是像这样cast(field as varchar)或cast(fields as date)这样的字段
【讨论】:
【参考方案11】:我认为你应该转换为 utf8
--set utf8 for connection
SET collation_connection = 'utf8_general_ci'
--change CHARACTER SET of DB to utf8
ALTER DATABASE dbName CHARACTER SET utf8 COLLATE utf8_general_ci
--change CHARACTER SET of table to utf8
ALTER TABLE tableName CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
【讨论】:
我使用 Collate utf8_unicode_ci(而不是 utf8_general_ci)来解决问题:非法混合排序规则 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) for operation '='【参考方案12】:简而言之,这个错误是由于 MySQL 试图对具有不同排序规则设置的两个事物进行操作引起的。如果您使设置匹配,错误就会消失。当然,您需要为您的数据库选择正确的设置,具体取决于它的用途。
这里有一些关于在两个非常常见的 utf8 排序规则之间进行选择的好建议:What's the difference between utf8_general_ci and utf8_unicode_ci
如果您使用的是 phpMyAdmin,您可以通过检查错误消息中提到的表格并检查每列的排序规则来系统地执行此操作。首先,您应该检查数据库的整体排序规则设置 - phpMyAdmin 可以告诉您并在必要时更改它。但是每个表中的每一列都可以有自己的设置。通常你会希望所有这些都匹配。
在小型数据库中,这很容易手动完成,无论如何,如果您完整阅读错误消息,它通常会将您指向正确的位置。不要忘记查看包含子表的列的“结构”设置。当您发现不匹配的排序规则时,您可以直接使用 phpMyAdmin 进行更改,无需使用查询窗口。然后再次尝试您的操作。如果错误仍然存在,请继续查找!
【讨论】:
【参考方案13】:我在存储过程的 where 子句中遇到了同样的错误。我发现问题出在本地声明的变量上,以前由同一个表/列加载。
我解决了将数据转换为单个字符类型的问题。
【讨论】:
【参考方案14】:以下是检查哪些列是错误排序规则的方法:
SELECT table_schema, table_name, column_name, character_set_name, collation_name
FROM information_schema.columns
WHERE collation_name = 'latin1_general_ci'
ORDER BY table_schema, table_name,ordinal_position;
这是修复它的查询:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET latin1 COLLATE 'latin1_swedish_ci';
Link
【讨论】:
【参考方案15】:我在 PhpMyadmin 上遇到了同样的错误,并且这里指出的解决方案对我有用
ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
Illegal mix of collations MySQL Error 此外,我建议使用 General 而不是瑞典语,因为这是默认语言,除非您的应用程序使用瑞典语,否则不要使用该语言。
【讨论】:
【参考方案16】:您需要将每列排序规则从 latin1_general_ci 更改为 latin1_swedish_ci
【讨论】:
【参考方案17】:检查每个表的排序规则类型,并确保它们具有相同的排序规则。
然后检查您在操作中使用的每个表字段的排序规则类型。
我遇到了同样的错误,这个技巧对我有用。
【讨论】:
【参考方案18】:SELECT username, AVG(rating) as TheAverage, COUNT(*) as TheCount
FROM ratings
WHERE month='Aug'
AND username COLLATE latin1_general_ci IN
(
SELECT username
FROM users
WHERE gender = 1
)
GROUP BY
username
HAVING
TheCount > 4
ORDER BY
TheAverage DESC, TheCount DESC;
【讨论】:
【参考方案19】: 检查您的 users.gender 列是否为 INTEGER。 试试看:alter table users convert to character set latin1 collate latin1_swedish_ci;
【讨论】:
【参考方案20】:确保您的 MySQL 版本支持子查询 (4.1+)。接下来,您可以尝试将查询重写为以下内容:
SELECT ratings.username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount FROM ratings, users
WHERE ratings.month='Aug' and ratings.username = users.username
AND users.gender = 1
GROUP BY ratings.username
HAVING TheCount > 4 ORDER BY TheAverage DESC, TheCount DESC
【讨论】:
对了,你的 users.gender 列是 int 类型的吗? 我试过了:SELECT ratings.username, (SUM(ratings.rating)/COUNT()) as TheAverage, Count() as TheCount FROM rating, users WHERE rating .month='Aug' and ratings.username = users.username AND users.gender = 1 GROUP BY rating.username HAVING TheCount > 4 ORDER BY TheAverage DESC, TheCount DESC 遇到和以前一样的错误吗?是的,Gender 是一个整数。以上是关于MySql 中的非法混合排序规则错误的主要内容,如果未能解决你的问题,请参考以下文章
Jira中的Mysql错误“操作'='的排序规则(latin1_swedish_ci,I MPLICIT)和(utf8_general_ci,COERCIBLE)的非法混合”[重复]