【问题标题】:Illegal mix of collations error in MySqlMySql 中的非法混合排序规则错误
【发布时间】: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

【问题讨论】:

标签: mysql collation mysql-error-1267


【解决方案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
                  

                  【讨论】:

                  • 我使用 Collat​​e 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 是一个整数。
                                  猜你喜欢
                                  • 1970-01-01
                                  • 2010-11-03
                                  • 2017-10-19
                                  • 2012-08-28
                                  • 2011-03-03
                                  相关资源
                                  最近更新 更多