【数据库-MySql】Illegal mix of collations for operation ‘concat_ws‘

 1、错误信息 

软件:Navicat for MySQL (Version 9.0.15 - enterprise)

操作:Tools - "Data  Synchronization..."(数据同步),使用Navicat Premium 进行数据同步没有问题

结论:Navicat for MySQL (Version 9.0.15 - enterprise) 这个版本同步数据存在bug,具体分析请详细阅读此文。

[Msg] [Sync] Synchronization Start...
[Msg] [Sync] Synchronizing: localhost_rdis.`atdps_a`.`a1` -> localhost_rdis.`atdps_a`.`prescription_medicine`
[Err] [Sync] Source server SQL execution error:1271 - Illegal mix of collations for operation 'concat_ws'
[Err] [Sync] 1271 - 1271 - Illegal mix of collations for operation 'concat_ws'
[Msg] [Sync] Synchronization Failed: MD5 signature preparation failure
[Msg] [Sync] Finished - Unsuccessful Synchronization
[Msg] [Sync] Source Server: ROLLBACK
[Msg] [Sync] Target Server: ROLLBACK
--------------------------------------------------

2、Mysql 记录日志如下

如何查看Mysql日志记录?

event_timeuser_hostthread_idservercommand_typeargument
2020年8月4日 14:34:55[rdis] @ localhost [127.0.0.1]1108720Connectrdis@localhost on 
2020年8月4日 14:34:55rdis[rdis] @ localhost [127.0.0.1]1108720QuerySET NAMES utf8
2020年8月4日 14:34:55rdis[rdis] @ localhost [127.0.0.1]1108720QuerySHOW VARIABLES LIKE 'lower_case_%'
2020年8月4日 14:34:55rdis[rdis] @ localhost [127.0.0.1]1108720QuerySHOW VARIABLES LIKE 'profiling'
2020年8月4日 14:34:55rdis[rdis] @ localhost [127.0.0.1]1108720QuerySHOW CHARACTER SET
2020年8月4日 14:34:55rdis[rdis] @ localhost [127.0.0.1]1108720QuerySHOW COLLATION
2020年8月4日 14:34:55rdis[rdis] @ localhost [127.0.0.1]1108720QuerySHOW DATABASES
2020年8月4日 14:34:56[rdis] @ localhost [127.0.0.1]1108730Connectrdis@localhost on 
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108730QuerySET NAMES utf8
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108730QuerySHOW VARIABLES LIKE 'lower_case_%'
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108730QuerySHOW VARIABLES LIKE 'profiling'
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108730QuerySHOW CHARACTER SET
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108730QuerySHOW COLLATION
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108730QuerySHOW DATABASES
2020年8月4日 14:34:56[rdis] @ localhost [127.0.0.1]1108740Connectrdis@localhost on 
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108740QuerySET NAMES utf8
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108740Init DBatdps_a
2020年8月4日 14:34:56[rdis] @ localhost [127.0.0.1]1108750Connectrdis@localhost on 
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108750QuerySET NAMES utf8
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108750Init DBatdps_a
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108750QuerySET FOREIGN_KEY_CHECKS=0
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108740QuerySET AUTOCOMMIT=0
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108740QueryBEGIN
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108750QuerySET AUTOCOMMIT=0
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108750QueryBEGIN
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108740QuerySELECT * FROM `a1` LIMIT 0
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108750QuerySELECT * FROM `prescription_medicine` LIMIT 0
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108740QuerySET net_write_timeout=86400
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108740QuerySELECT BINARY CONCAT_WS(',',`SID`) ckey,MD5(CONCAT_WS(',',MD5(CONCAT_WS(',',IFNULL(LENGTH(`SID`),- 1),IFNULL(LENGTH(`PATIENT_ID`),- 1))),`SID`,`PATIENT_ID`)) md5a,`SID` FROM    `a1`ORDER BY ckey
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108740QueryROLLBACK
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108750QueryROLLBACK
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108720Quit 
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108740Quit 
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108730Quit 
2020年8月4日 14:34:56rdis[rdis] @ localhost [127.0.0.1]1108750Quit 

2.1 其报错语句如下

SELECT BINARY CONCAT_WS(',',`SID`) ckey,MD5(CONCAT_WS(',',MD5(CONCAT_WS(',',IFNULL(LENGTH(`SID`),- 1),IFNULL(LENGTH(`PATIENT_ID`),- 1))),`SID`,`PATIENT_ID`)) md5a,`SID` FROM	`a1`ORDER BY ckey

2.1.1、美化

SELECT
	BINARY CONCAT_WS(',', `SID`) ckey,
	MD5(
		CONCAT_WS(
			',',
			MD5(
				CONCAT_WS(
					',',
					IFNULL(LENGTH(`SID`) ,- 1),
					IFNULL(LENGTH(`PATIENT_ID`) ,- 1)
				)
			),
			`SID`,
			`PATIENT_ID`
		)
	) md5a,
	`SID`
FROM
	`a1`
ORDER BY
	ckey

2.1.2 问题分析

[Err] 1271 - Illegal mix of collations for operation 'concat_ws'

 2.1.2.1、对于查询进行拆分,插入临时表进行分析

DROP TABLE IF EXISTS t2;CREATE TABLE if  NOT EXISTS t2 SELECT
	BINARY CONCAT_WS(',', `SID`) ckey,
	SID as  SID,
	PATIENT_ID as  PATIENT_ID,
	CONCAT_WS(
					',',
					IFNULL(LENGTH(`SID`) ,- 1),
					IFNULL(LENGTH(`PATIENT_ID`) ,- 1)
				) as l1,
			MD5(
				CONCAT_WS(
					',',
					IFNULL(LENGTH(`SID`) ,- 1),
					IFNULL(LENGTH(`PATIENT_ID`) ,- 1)
				)
			) as l2,

	MD5(
		CONCAT_WS(
			',',
			MD5(
				CONCAT_WS(
					',',
					IFNULL(LENGTH(`SID`) ,- 1),
					IFNULL(LENGTH(`PATIENT_ID`) ,- 1)
				)
			),
			`SID`,
			`PATIENT_ID`
		)
	) md5a
FROM
	`a1`
ORDER BY
	ckey;
SELECT COLUMN_NAME,CHARACTER_SET_NAME,COLLATION_NAME FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA  = 'atdps_a' AND TABLE_NAME = 't2';

 2.1.2.2、查询结果 

 

2.1.2.3、分析

下面语句中 “MD5(CONCAT_WS(',',IFNULL(LENGTH(`SID`) ,- 1),IFNULL(LENGTH(`PATIENT_ID`) ,- 1)))” 的字符集是【utf8mb4    utf8mb4_general_ci】而Patient_ID的字符集是【gbk    gbk_chinese_ci】,而CONCAT_WS不允许多个字符集的数据进行字符串拼接。

----------------------------------------------------------------------------------------------    

MD5(
        CONCAT_WS(
            ',',
            MD5(CONCAT_WS(',',IFNULL(LENGTH(`SID`) ,- 1),IFNULL(LENGTH(`PATIENT_ID`) ,- 1))),
            `SID`,
            `PATIENT_ID`

        )
    ) md5a

---------------------------------------------------------------------------------------------------

解决方案:使用 CONVERT 函数将不一致的字符集数据转换为一致

---------------------------------------------------------------------------------------------------

    MD5(
        CONCAT_WS(
            ',',

            CONVERT(

             MD5(CONCAT_WS(',',IFNULL(LENGTH(`SID`) ,- 1),IFNULL(LENGTH(`PATIENT_ID`) ,- 1)))

            USING gbk ) COLLATE gbk_chinese_ci,
            `SID`,
            `PATIENT_ID`

        )
    ) md5a

---------------------------------------------------------------------------------------------------

2.1.3、修复问题

SELECT
	BINARY CONCAT_WS(',', `SID`) ckey,
	
	MD5(
		CONCAT_WS(
			',',
			CONVERT(MD5(
				CONCAT_WS(
					',',
					IFNULL(LENGTH(`SID`) ,- 1),
					IFNULL(LENGTH(`PATIENT_ID`) ,- 1)
				)
			) USING gbk ) COLLATE gbk_chinese_ci,
			`SID`,
			`PATIENT_ID`
		)
	) md5a,
	`SID`
FROM
	`a1`
ORDER BY
	ckey;

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值