mysql: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '= 的解决

昨天把mysql里所有table的varchar字段的字符集,批量换成了utf8mb4/utf8mb4_unicode_ci ,以便能保存一些emoji火星文 , 结果有一个sql语句执行时,报错如下:

Illegalmixofcollations(utf8_unicode_ci,IMPLICIT)and(utf8_general_ci,IMPLICIT)foroperation '=

观察了一下,这个sql使用了一个自定义的function,这个函数的入口参数为varchar,类似如下:

CREATE FUNCTION `f_xxx`(
  p_ref_type     VARCHAR(50) ,
  ...
)

问题就在这里,把p_ref_type的参数类型改成:

CREATE FUNCTION `f_xxx`(
  p_ref_type     VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
  ...
)

就ok了。

 

当然,如果不想改function,还有一种一劳永逸的解决办法:(需要停机)

出错信息的意思是 utf8-unicode-cli与utf-general-cli 不能混用,可以用

show create function f_xxx\G 查看下结构,重点观察下最后几行:

...

  END
character_set_client: utf8mb4
collation_connection: utf8mb4_unicode_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

这里可以看出,collation_connnection 与 Database Collation所用的字符集不一致,要想办法弄成一致,可以再用:

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

查看mysql的相关系统变量:

| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |

大概输出是这样的,注意最后3行,确认mysql实例的编码后,可以调整database的编码:

ALTER DATABASE `数据库名` character set utf8mb4 COLLATE utf8mb4_general_ci ;

考虑到,有些表或字段在创建时,可能也指定了其它编码,可以用:

./mysqldump -u用户名 -p -d --add-drop-table 数据库名 > 导出的文件名

注:为防止操作期间有人操作数据库,最好将所有应用暂时停机,保证操作期间db没人向其写入数据 。

导出表结构的sql,然后用文本编码工具,批量把指定字符集的字符串给批量清空,即:清除所有指定字符集的DDL语句,全部默认用database本身的字符集

接下来用

./mysqldump -u用户名 -p -t 数据库名 > 导出的文件名 

导出所有数据

最后,干掉所有table,然后mysql命令行下

source 修改好以后的数据库表结构.sql

source 数据.sql

将所有表重建,然后导入数据,进行恢复,最终目标是将整个db,包括所有表及字段的字符集大换血了

 

时间: 2024-09-08 13:35:02

mysql: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '= 的解决的相关文章

Illegal mix of collations (big5_chinese_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'

解释: 非法的混合排序规则(big5_chinese_ci)和(utf8_general_ci)操作"like". 原本是单个字段查询数据的,现在是把所有的字段用一个搜索框来查询. 主要出问题是下列这个查询条件   两张表里 存在相同的ID_Card字段,但是两张表中的字段字符集和排序规则是不一样的. 一张表是:   另外一张表示:   改成utf8_general_ci就可以了! 主要是排序规则的问题! 排序规则:          

mysql 保存数据出现 Illegal mix of collations (gbk_chinese_ci,IMPLICIT)

mysql教程 保存数据出现 illegal mix of collations (gbk_chinese_ci,implicit) 其它这种问题很简单处理,就是页面提交的数据与mysql字段类型不一致影起的,只要把它们统一就可以了. 下现来看一下处理方法. 利用php教程函数 iconv()函数, gb2312转换成utf-8 $utf=iconv('gb2312', 'utf-8', $_request['keyword']);   将字符串utf-8码转换为gb2312码 $str   =

mysql提示:Illegal mix of collations for operation ‘UNION’

 语句很简单  代码如下   <?php $connection=mysql_connect("localhost","root","password"); //连接并选择数据库服务器 mysql_select_db("test",$connection); $query="select * from users where name='你好'"; $result=mysql_query($query

解决Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COER

部署完项目,测试一下,诶,数据出来了 没有多大问题(暗舒一口气).继续测吧,一点新建完了,报错了,看看什么错误 一看完了 java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 是这个错误 ,什么原因呢,第一次遇到. 头大了.去查文档说是:结果集中有两种字符集. 我晕了 ,怎么会这样呢,看看表结构,

Mysql彻底解决中文乱码问题的方案(Illegal mix of collations for operation)_Mysql

mysql 中常常出现对中文支持不友好的情况常见的错误 "Illegal mix of collations for operation" 下面我们规整一下 mysql 数据库中一共涉及到哪些字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的 character-set-database:数据库字符集 character-set-table:数据库表字符集 一般情况下只需要设置character-set-ser

Illegal mix of collations (latin1

部署完项目,测试一下,诶,数据出来了 没有多大问题(暗舒一口气).继续测吧,一点新建完了,报错了,看看什么错误 一看完了 java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 是这个错误 ,什么原因呢,第一次遇到. 头大了.去查文档说是:结果集中有两种字符集. 我晕了 ,怎么会这样呢,看看表结构,

mysql 中关于:Error Code: 1267 Illegal mix of collations (gbk_chinese_ci,IMPLICIT) a

问题描述 mysql中关于:ErrorCode:1267Illegalmixofcollations(gbk_chinese_ci,IMPLICIT)and(utf8_general_ci,COERCIBLE)如何办,搞了很久,按照网上的经验,还是不行啊.

MySQL中can't create PID file: No such file or directory错误的解决方法

风信网(ithov.com)原创文章:安装mysql完成之后,启动mysql报以下错误信息 [root@localhost mysql]# /usr/local/mysql/bin/mysqld_safe & 131206 22:50:00 mysqld_safe Logging to '/var/log/mysqld.log'. 131206 22:50:00 mysqld_safe Starting mysqld daemon with databases from /data/mysql/

MySQL错误“Specified key was too long; max key length is 1000 bytes”的解决办法

MySQL错误"Specified key was too long; max key length is 1000 bytes"的解决办法 经过查询才知道,是Mysql的字段设置的太长了,于是我把这两个字段的长度改了一下就好了.  建立索引时,数据库计算key的长度是累加所有Index用到的字段的char长度后再按下面比例乘起来不能超过限定的key长度1000:  latin1 = 1 byte = 1 character  uft8 = 3 byte = 1 character