我想在mysql中执行此CONCAT查询排序规则的非法混合运行“CONCAT”
SELECT CONCAT(if(fName,fName,''),Name)
From Student
错误:
#1271 - Illegal mix of collations for operation 'concat'
我想在mysql中执行此CONCAT查询排序规则的非法混合运行“CONCAT”
SELECT CONCAT(if(fName,fName,''),Name)
From Student
错误:
#1271 - Illegal mix of collations for operation 'concat'
的字符集和/或你在连接使用排序规则不匹配表中的字符集/排序规则。
有4个解决方案:
1更改字符集在您的连接:
//find out the charset used in your table.
SHOW TABLES LIKE 'student'
//set the server charset to match
SET NAMES 'charset_name' [COLLATE 'collation_name']
2 - 改变你的表使用的字符集相匹配的服务器字符集:
//find out the charset used in the server
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
//Change the charset used in the table
ALTER TABLE student ......
3-更改默认字符集设置a nd restart MySQL
编辑My.ini并替换character_set_*
选项,以便它们与您的表匹配。
4-更改您的连接
您的客户端可以覆盖字符集和排序规则设置的字符集设置。
如果没有选项1或3应该解决您的问题,但是如果连接覆盖这些设置,则需要检查连接字符串并编辑字符集/归类设置以匹配数据库。
几点建议:
查找的字符集。我推荐UTF8
和排序规则:我建议utf8_general_ci
。并随处使用。
另外,在德国这样的国家,你可以使用utf8_latin1_ci,它在正确的位置合并了德语变音符号(例如:a后面的a)。 – 0xCAFEBABE
@CAFEBABE,latin1听起来像是西方数据库的更好选择。 – Johan
@Johan,有时您需要使用具有不同排序规则的表,并且您无权更改所述表的排序规则。 – Pacerier
看起来好像在这里的if
语句中有一个未命中的用法,因为它会导致undefined
数据类型,所以concat
操作将因数据类型不同而失败。请尝试改为使用ifnull
代替查询。
试试这个查询,而不是:
SELECT concat(ifnull(fName,''),Name) From Student
看到演示这里http://www.sqlize.com/kfy85j8f1e
另一个参考也http://forums.mysql.com/read.php?10,225982,225982#msg-225982
阅读,如果所有使用的值的排序规则匹配,或者您有一个串联只能工作使用排序规则,所有归类都是(从逻辑角度来看)的子集。
如果要连接文本,每个文本应该是相同的排序规则。看看数据库使用的整理,然后看看你的连接使用的归类:
show variables like '%coll%'
的collation_connection是应该与您尝试来连接表的排序规则。如果没有,则会出现错误消息。
然后,您可以更改连接归类以匹配表中的一个。
您是否有一些“所有归类都是子集的归类”示例? – Pacerier
这是由于集合差异,可以通过这两个字符串或列转换 一个收集解决说UTF8
CONCAT(CAST(fName AS CHAR CHARACTER SET utf8),CAST('' AS CHAR CHARACTER SET utf8))
这将解决:)
可以查看更多在这里铸造MySQL Casting
试试这个..
CONCAT(CAST(fName AS CHAR CHARACTER SET utf8),CAST('' AS CHAR CHARACTER SET utf8))
你能描述你当前的学生表结构吗? – Gajahlemu
Student => id int,Name varchar,fName varchar –
这些列具有哪些归类? –