#1271 - 在 like 查询中非法混合操作 'UNION' 的归类
#1271 - Illegal mix of collations for operation 'UNION' in like query
我检查了每个 table 的归类类型,它们具有相同的归类。
错误:#1271 - 操作排序规则的非法混合 'UNION'
请看下面的查询:
$query = "(SELECT id, product_name, description, 'tbl_landt' as type FROM tbl_landt WHERE product_name LIKE '%" .
$keyword . "%' OR description LIKE '%" . $keyword ."%')
UNION
(SELECT id, name, null, 'tbl_land_cat' as type FROM tbl_land_cat WHERE name LIKE '%" . $keyword . "%')
UNION
(SELECT tbl_sub_cat.id, tbl_sub_cat.name AS cat_name, null, 'tbl_sub_cat' as type FROM tbl_sub_cat WHERE name LIKE '%" . $keyword . "%')
UNION
(SELECT id, name, null, 'tbl_exl_cat' as type FROM tbl_exl_cat WHERE name LIKE '%" . $keyword . "%')";
$squery = mysql_query($query);
确保列具有相同的数据类型、编码和名称。例如,其中一个联合命名为 name,下一个联合声明命名为 cat_name。确保 select 中的别名在所有联合中都相同。
要解决此问题,您可能需要将 SELECT 列表(在一个或多个查询中)中的某些列引用替换为表达式,例如 CONVERT(name USING utf8) AS name
。
最有可能的问题是查询返回的列具有不同的字符集。 (报错提示是UNION操作有问题,不是其他比较谓词(WHERE子句中的字符比较,也可能出现此类错误。)
要对此进行调试,您需要检查每个查询中返回的表达式的字符集,并进行比较。要缩小范围,您可以尝试测试查询的子集以...
(query1) UNION (query2)
(query1) UNION (query3)
(query1) UNION (query4)
这应该可以缩小导致问题的组合范围。
然后检查返回的字符类型列的字符集,作为 table/column 定义的一部分。
参考文献:
MySQL CONVERT
函数参考:
http://dev.mysql.com/doc/refman/5.6/en/charset-convert.html
显示 MySQL 中可用的字符集(和排序规则):
SHOW COLLATION
要检查查询中引用的列的字符集...
SHOW CREATE TABLE tbl_landt
SHOW CREATE TABLE tbl_land_cat
etc.
此外,请参阅 Whosebug 中的这个(旧)问题,以更详细地讨论 MySQL...
中字符集的强制性
我能够修复在
时失败的 CREATE VIEW 查询的错误
COALESCE(<TIMESTAMP>,<DATETIME>)
按照建议 here 将结果转换为 DATETIME,例如:
CAST( COALESCE( <TIMESTAMP> , <DATETIME> ) AS DATETIME
我检查了每个 table 的归类类型,它们具有相同的归类。
错误:#1271 - 操作排序规则的非法混合 'UNION'
请看下面的查询:
$query = "(SELECT id, product_name, description, 'tbl_landt' as type FROM tbl_landt WHERE product_name LIKE '%" .
$keyword . "%' OR description LIKE '%" . $keyword ."%')
UNION
(SELECT id, name, null, 'tbl_land_cat' as type FROM tbl_land_cat WHERE name LIKE '%" . $keyword . "%')
UNION
(SELECT tbl_sub_cat.id, tbl_sub_cat.name AS cat_name, null, 'tbl_sub_cat' as type FROM tbl_sub_cat WHERE name LIKE '%" . $keyword . "%')
UNION
(SELECT id, name, null, 'tbl_exl_cat' as type FROM tbl_exl_cat WHERE name LIKE '%" . $keyword . "%')";
$squery = mysql_query($query);
确保列具有相同的数据类型、编码和名称。例如,其中一个联合命名为 name,下一个联合声明命名为 cat_name。确保 select 中的别名在所有联合中都相同。
要解决此问题,您可能需要将 SELECT 列表(在一个或多个查询中)中的某些列引用替换为表达式,例如 CONVERT(name USING utf8) AS name
。
最有可能的问题是查询返回的列具有不同的字符集。 (报错提示是UNION操作有问题,不是其他比较谓词(WHERE子句中的字符比较,也可能出现此类错误。)
要对此进行调试,您需要检查每个查询中返回的表达式的字符集,并进行比较。要缩小范围,您可以尝试测试查询的子集以...
(query1) UNION (query2)
(query1) UNION (query3)
(query1) UNION (query4)
这应该可以缩小导致问题的组合范围。
然后检查返回的字符类型列的字符集,作为 table/column 定义的一部分。
参考文献:
MySQL CONVERT
函数参考:
http://dev.mysql.com/doc/refman/5.6/en/charset-convert.html
显示 MySQL 中可用的字符集(和排序规则):
SHOW COLLATION
要检查查询中引用的列的字符集...
SHOW CREATE TABLE tbl_landt
SHOW CREATE TABLE tbl_land_cat
etc.
此外,请参阅 Whosebug 中的这个(旧)问题,以更详细地讨论 MySQL...
中字符集的强制性我能够修复在
时失败的 CREATE VIEW 查询的错误COALESCE(<TIMESTAMP>,<DATETIME>)
按照建议 here 将结果转换为 DATETIME,例如:
CAST( COALESCE( <TIMESTAMP> , <DATETIME> ) AS DATETIME