3

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

我的 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​​ions (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'coalesce'

4

4 回答 4

6

您还可以使用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)

于 2012-12-28T12:39:48.523 回答
1

这有点老了,但我也有同样的错误,据我所知,视图没有排序规则,表格有。所以,如果你得到“非法混合......”是因为你的视图正在链接(比较,无论如何)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 喜欢创建所有视图的表,然后创建视图。这些表是在没有排序规则的情况下创建的,因此它采用默认排序规则。然后,很多时候,在创建视图时使用不同的排序规则。

于 2014-06-20T22:09:52.620 回答
0

这实际上是 MySQL 中的一个错误

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

于 2012-12-28T12:26:50.973 回答
0

在搜索了一段时间并从这个答案中获取信息之后,我发现了一个可能有用的黑客。

只需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。

参考:阅读更多关于 MariaDB 上的非法整理组合的信息。

MariaDB 上非法整理组合的引用

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

在此处阅读有关排序规则字符集 的更多信息。

于 2020-02-07T06:41:14.417 回答