我会非常明确地说:在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)操作'合并'
答案 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。