MySql中归类错误的非法混合

问题描述 投票:41回答:18

只需从上一个问题得到此答案,它就可以治疗!

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

mysql collation mysql-error-1267
18个回答
18
投票

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

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

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


1
投票

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


1
投票

我也遇到同样的错误,但在我的情况下,主要问题是在[[where


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;

0
投票
尽可能使用ascii_bin,它将与几乎所有排序规则匹配。用户名很少会接受特殊字符。

0
投票
如果要避免更改语法来解决此问题,请尝试以下操作:

0
投票
对于具有从0到1设置的字段的集合警告,我也有同样的问题。所有列的集合都是相同的。我们尝试再次更改集合,但没有任何方法可以解决此问题。

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

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

-2
投票
请确保您的MySQL版本支持子查询(4.1+)。接下来,您可以尝试将查询重写为类似以下内容:

83
投票

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

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
投票

[MySQL]

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

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

  • 选择1个AS编号联合全部选择2联合全部选择3

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

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

CONVERT('my text' USING utf8)

请参见MySQL网站上的CONVERT and CAST documentation。>>

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

ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

Illegal mix of collations MySQL Error我也建议使用General而不是swedish,因为这是默认设置,除非您的应用程序使用瑞典语,否则不要使用该语言。

我认为您应该转换为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
  • 检查您的users.gender列是否为INTEGER。
  • 尝试:alter table users convert to character set latin1 collate latin1_swedish_ci;
  • 您需要将每个列排序规则

    从latin1_general_ci更改为latin1_swedish_ci

    我在where子句的存储过程中遇到了相同的错误。我发现该问题是由先前由同一表/列加载的局部声明的变量引起的。

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

    简而言之,此错误是由MySQL试图对具有不同排序规则设置的两件事进行操作引起的。如果您使设置匹配,错误将消失。当然,您需要根据数据库的用途来选择正确的设置。

    以下是在两个非常常见的utf8归类之间进行选择的一些好的建议:What's the difference between utf8_general_ci and utf8_unicode_ci

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

    在小型数据库中,这很容易手动完成,在任何情况下,如果您完整阅读错误消息,通常会将您指向正确的位置。别忘了查看带有子表的列的“结构”设置。当您找到不匹配的排序规则时,可以直接使用phpMyAdmin进行更改,而无需使用查询窗口。然后再次尝试操作。如果错误仍然存​​在,请继续寻找!

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

    我也遇到同样的错误,但在我的情况下,主要问题是在[[where

    条件下,我正在检查的参数具有一些未知的隐藏字符(+%A0

    [A0

    转换时,我得到了160,但是160超出了db知道的字符范围,这就是为什么数据库无法将其识别为字符的原因,其他原因是我的表列是varchar
    • 我所做的解决方案是我检查是否有类似的字符,并在运行sql命令之前将其删除

  • ex:-preg_replace('/ \ D /','',$ myParameter);
  • 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;
    尽可能使用ascii_bin,它将与几乎所有排序规则匹配。用户名很少会接受特殊字符。

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

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

    这为我解决了问题。

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

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

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

    enter image description here

    HAvING TheCount > 4 AND username IN (SELECT username FROM users WHERE gender=1)
    但是我为什么回答,您没有将我投票为正确答案:)

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


    5
    投票

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


    2
    投票

    我认为您应该转换为utf8


    1
    投票
    • 检查您的users.gender列是否为INTEGER。

    1
    投票

    您需要将每个列排序规则


    1
    投票

    我在where子句的存储过程中遇到了相同的错误。我发现该问题是由先前由同一表/列加载的局部声明的变量引起的。


    1
    投票

    简而言之,此错误是由MySQL试图对具有不同排序规则设置的两件事进行操作引起的。如果您使设置匹配,错误将消失。当然,您需要根据数据库的用途来选择正确的设置。

    © www.soinside.com 2019 - 2024. All rights reserved.