【问题标题】:Illegal mix of collations for operation 'concat'操作“concat”的排序规则的非法混合
【发布时间】:2011-12-06 21:43:29
【问题描述】:

我正在尝试在 mysql 中执行这个 concat 查询

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

错误:

#1271 - 操作“concat”的排序规则的非法混合

【问题讨论】:

  • 您能描述一下您当前的 Student 表结构吗?
  • Student=> id int ,Name varchar, fName varchar
  • 列有哪些排序规则?
  • 不,我没有可能是 mysql 错误

标签: mysql sql


【解决方案1】:

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

有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- 更改默认字符集设置并重新启动 MySQL

编辑 My.ini 并替换 character_set_* 选项,使它们与您的表匹配。

4- 更改连接的字符集设置

您的客户可以覆盖字符集和排序规则设置。
如果它没有选项 1 或 3 应该可以解决您的问题,但是如果连接覆盖了这些设置,您需要检查连接字符串并编辑字符集/排序规则设置以匹配您的数据库。

一些建议:

找到一个字符集。我推荐UTF8 和一个排序规则:我推荐utf8_general_ci。并在任何地方始终如一地使用它们。

【讨论】:

  • 或者,在德国等国家/地区,您可以使用 utf8_latin1_ci,它将德国元音变音符号合并到正确的位置(例如 a 后的 ä)。
  • @CAFEBABE,latin1 听起来是西方数据库的更好选择。
  • @Johan,有时您需要使用具有不同排序规则的表,而您无权更改所述表的排序规则。
  • 如果从concat 中调用用户定义的函数,它也可能有助于SET NAMES [your_preferred_charset]; 然后删除并重新定义过程和函数。
【解决方案2】:

这是由于集合不同,可以通过转换两个字符串或列来解决 对一个集合说 UTF8

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

这将解决:)

你可以在这里MySQL Casting查看更多关于在 MySQL 中转换的信息

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 你说客户端库,是指官方mysqlcmd客户端吗?
    • @Pacerier 是的,现在已弃用的 ext/mysql 一个
    • 已弃用?你说的是 PHP 吗?
    • 当然,还有什么?您是否错过了关于旧的 mysql 扩展被弃用甚至为 php7 删除的备忘录?这与 mysqli 无关
    • 我的意思是从什么时候开始这成为一个 PHP 问题?这里的每个人都在谈论 MySql,而不是 C# Java 或 PHP。
    【解决方案4】:

    看起来你在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

    【讨论】:

      【解决方案5】:

      只有在所有使用值的排序规则都匹配或您使用所有排序规则都是子集的排序规则时(从逻辑角度),串联才能起作用。

      如果你想连接文本,每个文本应该是相同的排序规则。查看数据库使用的排序规则,然后查看您的连接使用的排序规则:

      show variables like '%coll%'
      

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

      然后您可以更改连接排序规则以匹配表之一。

      【讨论】:

      • 你有一些“所有排序规则都是子集的排序规则”的例子吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 2014-12-03
      相关资源
      最近更新 更多