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

MySQL视图-排序规则的非法混合,mysql,sql,mysql-error-1064,collation,Mysql,Sql,Mysql Error 1064,Collation,我将非常清楚:在MySQL中创建视图时,如果没有该死的非法混合排序规则的错误,有什么解决方案 我的SQL代码是这样的(它有一些葡萄牙语单词),我的数据库默认排序规则是latin1\u swedish\u ci: CREATE VIEW v_veiculos AS SELECT v.id, v.marca_id, v.modelo, v.placa, v.cor, CASE v.combustivel WHEN 'A' THEN 'Á

我将非常清楚:在MySQL中创建视图时,如果没有该死的非法混合排序规则的错误,有什么解决方案

我的SQL代码是这样的(它有一些葡萄牙语单词),我的数据库默认排序规则是latin1\u swedish\u 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,正如完整错误的描述告诉我的:非法混合排序规则(拉丁语-瑞典语-ci,隐式)和(utf8-通用词-ci,强制)用于操作“coalesce”

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

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

您还可以使用它将字符串转换为其他字符集。语法是:

CAST(character_string AS character_data_type CHARACTER SET charset_name)
例如:


替代方法:使用
CONVERT(expr使用转码\u name)

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

  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\u unicode\u ci
,因此我的表将使用此排序规则创建,并且我结束了一些带有
utf8\u西班牙语\u ci
的表和一些我没有使用
utf8\u unicode\u ci

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


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

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

只需使用以下命令检查数据库的默认字符集系统
default\u character\u set

SHOW VARIABLES LIKE "char%";
您将看到如下内容:

mysql>显示像“char%”这样的变量;
+--------------------------+----------------------------+
|变量名称|值|
+--------------------------+----------------------------+
|字符集客户端utf8mb4|
|字符集连接utf8mb4|
|字符集数据库utf8|
|字符集文件系统二进制
|字符集结果utf8mb4|
|字符集服务器utf8mb4|

|character_set_system | utf8 |我的MySQL版本是5.5.27-log:/I检查了错误报告。版本5.1.54中没有错误,但在以后的版本中出现了错误。在
mysql-5.5.b60101
中它似乎是固定的,但我不确定这是哪个版本的mysql。你可以在这个stackoverflow问题中得到答案[here][1][1]:@Chella change默认的数据库collate不起作用。我已经试过了。哇,使用这个代码会非常大,我不接受MySQL,不要简化这个任务。嘿,diEcho,你的解决方案部分解决了我的问题,在这种情况下,我是这样做的:
CONVERT(_-latin1'-Combustível:'使用utf8)
但结果类似于“燃烧水平”,而正确的结果是“燃烧水平”。你知道我怎样才能正确地投下这个吗?
SHOW VARIABLES LIKE "char%";
SET character_set_server = 'latin2';