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

时间:2012-12-28 12:22:07

标签: mysql sql mysql-error-1064 collation

我会非常明确地说:在MySQL中创建视图的解决方案是什么,而没有该版本非法混合排序错误。

我的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);

我认为错误原因是因为我使用合并和/或 concat ,因为完整错误的描述告诉我:非法混合排序( latin1_swedish_ci,IMPLICIT)和(utf8_general_ci,COERCIBLE)操作'合并'

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

这有点旧,但很好 我有同样的错误, 据我所知,Views没有整理,表格确实如此。 所以,如果你得到了#34;非法组合......"是因为您的视图链接(比较,无论如何)具有不同排序规则的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喜欢创建所有视图的表,然后是视图。创建的表没有排序规则,因此它采用默认值。然后,很多时候,创建视图时使用不同的排序规则。

答案 2 :(得分:0)

这实际上是MySQL中的bug

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

答案 3 :(得分:0)

搜索了一会儿并从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';

这对我来说很有效。

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

参考:有关Illegal Collation Mix on MariaDB.的更多信息

引文 Illegal Collation Mix on MariaDB

如果遇到此问题,请在视图中设置字符集,以将其设置为所需的值。

详细了解归类字符集 here