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('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)
在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