MySql中非法混合排序错误

时间:2009-08-06 22:21:14

标签: 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 - 非法混合   排序规则   (latin1_swedish_ci,IMPLICIT)和   (latin1_general_ci,IMPLICIT)for   operation'='

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

19 个答案:

答案 0 :(得分:77)

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

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

答案 1 :(得分:16)

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

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

我遇到了同样的错误,这些技巧对我有用。

答案 2 :(得分:13)

[MySQL的]

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

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

    SELECT 1 AS编号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

答案 3 :(得分:5)

我在PhpMyadmin上遇到同样的错误,并且此处显示的解决方案对我有用

ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

Illegal mix of collations MySQL Error 此外,我建议使用General而不是瑞典语,因为那是默认语言,除非您的应用程序使用瑞典语,否则不使用该语言。

答案 4 :(得分:1)

  • 检查您的users.gender列是否为INTEGER。
  • 尝试:alter table users convert to character set latin1 collate latin1_swedish_ci;

答案 5 :(得分:1)

我也遇到同样的错误,但是在我的情况下,主要问题是在其中条件下,我正在检查的参数具有一些未知的隐藏字符( +%A0

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

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

  • ex:-preg_replace('/ \ D /','',$ myParameter);

答案 6 :(得分:1)

您需要将每列Collat​​ion 从latin1_general_ci更改为latin1_swedish_ci

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

简而言之,这个错误是由MySQL尝试对两个具有不同排序规则设置的操作进行操作引起的。如果您将设置匹配,则错误将消失。当然,您需要为数据库选择正确的设置,具体取决于它将用于什么。

在两个非常常见的utf8排序规则之间进行选择时,我们提出了一些很好的建议:What's the difference between utf8_general_ci and utf8_unicode_ci

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

在一个小型数据库中,这很容易手工完成,无论如何,如果您完整地阅读了错误消息,它通常会指向正确的位置。别忘了看结构'包含子表的列的设置。当您发现不匹配的排序规则时,您可以直接使用phpMyAdmin更改它,无需使用查询窗口。然后再次尝试您的操作。如果错误仍然存​​在,请继续关注!

答案 9 :(得分:1)

我认为你应该转换为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

答案 10 :(得分:1)

这里的问题主要是,只需将此类型的强制转换(字段为varchar)或强制转换(字段作为日期)

答案 11 :(得分:0)

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

-将utf8设置为连接

public IActionResult Register()
{

    if (ModelState.IsValid) { //checking model state
                // send to the original action 
                return RedirectToAction("Index");
    }
    return View();
}

-将数据库的字符集更改为utf8

SET collation_connection = 'utf8_general_ci'

-更改类别表

ALTER DATABASE dbName CHARACTER SET utf8 COLLATE utf8_general_ci

答案 12 :(得分:0)

您需要为每个功能中的所有参数设置'utf8'。是我的情况:

enter image description here

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

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

将MySQL更新到5.5或更高版本。

这解决了我的问题。

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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;

答案 17 :(得分:-1)

HAvING TheCount > 4 AND username IN (SELECT username FROM users WHERE gender=1)

但为什么我要回答,你不能把我当作正确答案:)

答案 18 :(得分:-2)

确保您的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