MySql中非法混合排序规则错误

MySql中非法混合排序规则错误,mysql,collation,mysql-error-1267,Mysql,Collation,Mysql Error 1267,刚刚从前面的一个问题中得到了这个答案,这是一种享受 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-非法

刚刚从前面的一个问题中得到了这个答案,这是一种享受

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-非法混合 校勘 (拉丁语和瑞典语,隐式)和 (拉丁文1_一般_ci,隐式)用于 操作“=”

表格如下:


id、用户名、评级、月份

确保您的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列是否为整数
  • Try:
    alter table用户转换为字符集拉丁1校对拉丁1\u瑞典语\u ci

检查每个表的排序规则类型,并确保它们具有相同的排序规则

之后,还要检查在操作中使用的每个表字段的排序规则类型


我遇到了相同的错误,这些技巧对我很有效。

以下是如何检查哪些列是错误的排序规则:

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';

您需要将每个列的排序规则从latin1_general_ci更改为latin1_swedish_ci

我在PhpMyadmin上遇到了同样的错误,这里指出的解决方案对我有效吗

ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

另外,我建议使用General而不是swedish,因为这是默认语言,除非应用程序使用的是swedish,否则不要使用该语言。

我在存储过程的where子句中遇到了同样的错误。我发现问题发生在一个本地声明的变量上,该变量以前是由同一个表/列加载的


我解决了将数据强制转换为单个字符类型的问题。

简而言之,这个错误是由于MySQL试图对两个具有不同排序规则设置的对象执行操作造成的。如果设置匹配,错误将消失。当然,您需要根据数据库的用途选择正确的设置

以下是关于在两种非常常见的utf8排序规则之间进行选择的一些好建议:

如果您使用的是phpMyAdmin,则可以通过处理错误消息中提到的表,并检查每列的排序规则类型,系统地完成此操作。首先,您应该检查数据库的总体排序规则设置-phpMyAdmin可以告诉您这一点,并在必要时进行更改。但每个表中的每一列都可以有自己的设置。通常,您希望所有这些都匹配


在一个小的数据库中,这很容易手工完成,而且在任何情况下,如果您完整地阅读错误消息,它通常会将您指向正确的位置。不要忘记查看中包含子表的列的“结构”设置。当发现不匹配的排序规则时,可以直接使用phpMyAdmin对其进行更改,无需使用查询窗口。然后再试一次。如果错误仍然存在,请继续查找

我认为您应该转换为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
[MySQL]

在这些(非常罕见的)情况下:

  • 两个确实需要不同排序规则类型的表
  • 值不是来自表,而是来自显式枚举,例如:

    选择1作为数字全部联合选择2全部联合选择3

您可以使用CAST或CONVERT比较不同表之间的值:

CAST('my text' AS CHAR CHARACTER SET utf8)

CONVERT('my text' USING utf8)

请参见MySQL网站。

这里的问题主要是,只需像这样强制转换字段(字段为varchar)或强制转换字段(字段为date)

尽可能使用ascii\u-bin,它将与几乎任何排序规则相匹配。
用户名很少接受特殊字符。

如果您想避免更改语法来解决此问题,请尝试以下方法:

将MySQL更新到5.5或更高版本


这为我解决了问题。

对于设置为0到1的字段,我也有相同的收集警告问题。所有列集合都是相同的。我们再次尝试更改集合,但没有解决此问题


最后,我们将字段更新为
NULL
,然后更新为1,这克服了收集问题。

我也遇到了相同的错误,但在我的案例中,主要问题是在中,我检查的参数有一些未知的隐藏字符(+%A0

A0convert时,我得到了160,但160超出了db知道的字符范围,这就是为什么数据库无法将其识别为字符的原因。另一件事是我的表列是varchar

  • 我所做的解决方案是在运行sql命令之前检查是否存在类似的字符,并删除这些字符

  • 例如:-preg_replace('/\D/','$myParameter)


您需要为每个函数中的所有参数设置“utf8”。这是我的情况:


在Bagisto中创建类别时获取非法的排序规则混合。运行这些命令(谢谢@Quy Le)为我解决了这个问题:

--为连接设置utf8

SET collation_connection = 'utf8_general_ci'
--将DB的字符集更改为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

我遇到这个问题不是因为我存储在不同的排序规则中,而是因为我的列类型是JSON,它是二进制的

修正如下:

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
选择table.field将utf8mb4\u 0900\u ai\u ci作为fieldName进行比较

顺便问一下,你的users.gender列是整数类型吗?我尝试过:选择ratings.username,(SUM(ratings.rating)/COUNT())作为平均值,COUNT()作为来自ratings的计数,users WHERE ratings.month='Aug'和ratings.username=users.username和users.gender=1按ratings分组。username的计数按平均数排序>4,Count DESC得到了与以前相同的错误?是的,性别是一个整数。好的,我知道你在评论中的错误。这个错误是否说明了一切?您的表或字段具有混合排序规则。将其更改为所有表/字段具有相同的排序规则。顺便说一句。你真的应该找份工作
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