MySQL 视图 - 排序规则的非法混合

Posted

技术标签:

【中文标题】MySQL 视图 - 排序规则的非法混合【英文标题】:MySQL view - Illegal mix of collations 【发布时间】:2012-12-13 17:14:48 【问题描述】:

我会很清楚:在 mysql 中创建视图没有该死的 Illegal mix of colations 错误的解决方案是什么。

我的SQL代码是这样的(有一些葡萄牙语单词),我的数据库默认排序规则是latin1_swedish_ci

CREATE VIEW v_veiculos AS
SELECT
    v.id,
    v.marca_id,
    v.modelo,
    v.placa,
    v.cor,
    CASE v.combustivel
        WHEN 'A' THEN 'Álcool'
        WHEN 'O' THEN 'Óleo Diesel'
        WHEN 'G' THEN 'Gasolina'
        ELSE 'Não Informado'
    END AS combustivel,
    marcas.marca,
    /*I think that the CONCAT and COALESCE below causes this error, when the next line the view works fine*/
    CONCAT(marca, ' ', v.modelo, ' - Placa: ', v.placa, ' - Combustível: ', COALESCE(v.combustivel, 'Não informado')) AS info_completa
FROM veiculos v
LEFT JOIN
    marcas on(marcas.id = v.marca_id);

我认为错误原因是因为我使用了 coalesce 和/或 concat,因为完整错误的描述告诉我:Illegal mix of collat​​ion ( latin1_swedish_ci,IMPLICIT) 和 (utf8_general_ci,COERCIBLE) 用于操作“coalesce”

【问题讨论】:

您可以在这个 *** 问题 [这里][1] [1] 中得到答案:***.com/questions/3029321/… @Chella 更改默认数据库整理不起作用。我已经试过了。 【参考方案1】:

这实际上是 MySQL 中的 bug。

也许您可以更新到最新版本的 MySQL?

【讨论】:

我的 MySQL 版本是 5.5.27-log :/ 我检查了错误报告。该错误在 5.1.54 版本中不存在,但在更高版本中。好像在mysql-5.5.b60101中修复了,但是我不确定这是哪个版本的MySQL。【参考方案2】:

您也可以使用CAST() 将字符串转换为不同的字符集。语法是:

CAST(character_string AS character_data_type CHARACTER SET charset_name)

例如:

      SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8);

替代方案:使用CONVERT(expr USING transcoding_name)

【讨论】:

哇,使用这个代码会很大,我不接受 MySQL 不要简化这个任务。 嘿 diEcho,您的解决方案部分解决了我的问题,在这种情况下,我正在这样做:CONVERT(_latin1' - Combustível: ' USING utf8) 但当正确的结果是“Combustível”时,结果就像“Combustível”。你知道我怎样才能正确地投射这个吗?【参考方案3】:

这有点旧,但很好 我有同样的错误, 据我所知,视图没有排序规则,表格有。 所以,如果你得到“非法混合......”是因为你的视图正在链接(比较,无论如何)2个具有不同排序规则的表 问题是,如果你创建一个表,你可以指定排序规则,例如

  CREATE TABLE IF NOT EXISTS `vwHotelCode_Terminal` (
`HOTELCODE` varchar(8)
,`TERMINALCODE` varchar(5)
,`DISTKM` varchar(6)
,`DISTMIN` varchar(3)
,`TERMINALNAME` varchar(50)
)ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci  ;

但如果您不这样做,则会应用默认排序规则。所以对我来说,默认排序规则是utf8_unicode_ci,所以我的表将使用这个排序规则创建,我结束了一些带有utf8_spanish_ci 的表和我没有用utf8_unicode_ci 指定的表

如果您从一台服务器导出到另一台服务器并且默认排序规则不同,您可能会收到“非法混合”消息。

如果你有视图,phpmyadmin 喜欢创建所有视图的表,然后是视图。这些表是在没有排序规则的情况下创建的,因此它采用默认排序规则。然后,很多时候,在创建视图时使用不同的排序规则。

【讨论】:

【参考方案4】:

在搜索了一段时间并从这个answer 获取信息后,我发现了一个可能有用的hack

只需使用以下命令检查数据库的默认字符集系统default_character_set

SHOW VARIABLES LIKE "char%";

你会看到这样的东西:

mysql> SHOW VARIABLES LIKE "char%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | <-- | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+

我只是设置了 character_set_system,它只是默认的系统字符集。复制视图的创建代码并创建一个新视图,仅此而已。

这里发生的是您将创建的新视图将使用您为系统定义的新默认字符集。从而解决问题。

只需使用以下命令设置默认字符集

SET character_set_server = 'latin2';

这在我的情况下有效。

注意: 您也可以更改该视图的字符集。这也可以解决问题,但我找不到解决方案,所以我使用了这个 hack。

参考:阅读更多Illegal Collation Mix on MariaDB.

引自 Illegal Collation Mix on MariaDB:

如果遇到此问题,请在视图中设置字符集以强制其为您想要的值。

详细了解排序规则字符集here。

【讨论】:

以上是关于MySQL 视图 - 排序规则的非法混合的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 非法混合排序规则

MySQL某些字符导致“非法混合排序规则”错误

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

排序规则的非法混合 MySQL 错误

出现问题:MySQL中的排序规则的非法混合[重复]

在 LOCATE 中使用用户定义的变量时,MySQL 非法混合排序规则