2011-10-13 39 views
9

我想在mysql中执行此CONCAT查询排序规则的非法混合运行“CONCAT”

SELECT CONCAT(if(fName,fName,''),Name) 
From Student 

错误:

#1271 - Illegal mix of collations for operation 'concat'

+1

你能描述你当前的学生表结构吗? – Gajahlemu

+0

Student => id int,Name varchar,fName varchar –

+0

这些列具有哪些归类? –

回答

18

的字符集和/或你在连接使用排序规则不匹配表中的字符集/排序规则。

有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。并随处使用。

+0

另外,在德国这样的国家,你可以使用utf8_latin1_ci,它在正确的位置合并了德语变音符号(例如:a后面的a)。 – 0xCAFEBABE

+0

@CAFEBABE,latin1听起来像是西方数据库的更好选择。 – Johan

+1

@Johan,有时您需要使用具有不同排序规则的表,并且您无权更改所述表的排序规则。 – Pacerier

2

阅读,如果所有使用的值的排序规则匹配,或者您有一个串联只能工作使用排序规则,所有归类都是(从逻辑角度来看)的子集。

如果要连接文本,每个文本应该是相同的排序规则。看看数据库使用的整理,然后看看你的连接使用的归类:

show variables like '%coll%' 

的collat​​ion_connection是应该与您尝试来连接表的排序规则。如果没有,则会出现错误消息。

然后,您可以更改连接归类以匹配表中的一个。

+0

您是否有一些“所有归类都是子集的归类”示例? – Pacerier

2

它也可能是您的客户端库对于mysql服务器来说太旧的错误。
我们遇到了类似LIKE和字符“ő”的问题,并且使用PHP MySQL库版本5.1.52,但使用了MySQL服务器版本5.5.22。
升级客户端库后,问题消失了。

+0

当你说客户端库时,你是在谈论*官方的*'mysql' cmd客户端吗? – Pacerier

+0

@Pacerier是的,现在不推荐使用的分机/ mysql一个 – sztanpet

+0

已弃用?你在谈论PHP吗? – Pacerier

5

这是由于集合差异,可以通过这两个字符串或列转换 一个收集解决说UTF8

CONCAT(CAST(fName AS CHAR CHARACTER SET utf8),CAST('' AS CHAR CHARACTER SET utf8)) 

这将解决:)

可以查看更多在这里铸造MySQL Casting

0

试试这个..

CONCAT(CAST(fName AS CHAR CHARACTER SET utf8),CAST('' AS CHAR CHARACTER SET utf8)) 
相关问题