【MySQL】Navicat踩坑:Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation 'instr'


 

在Navicat客戶端上面執行SQL報錯

 

SQL語句:

WITH RECURSIVE transfer  (start_station, stop_station, stops, path) AS (
  SELECT station_name, next_station, 1, CAST(CONCAT(line_name, ':', station_name , ' -> ', line_name, next_station) AS CHAR(1000))
    FROM nanchang_metro WHERE station_name = '艾溪湖西'
   UNION ALL
  SELECT p.start_station, e.next_station, stops + 1, CONCAT(p.path, '->', e.line_name, e.next_station)
    FROM transfer p
    JOIN nanchang_metro e
      ON p.stop_station = e.station_name AND (INSTR(p.path, e.next_station) = 0)
) 
SELECT * FROM transfer WHERE stop_station ='瀝山';

報錯信息:

> 1267 - Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation 'instr' > 時間: 0s

 

我一開始也以為是自己的庫,表,字段,排序規則不一致導致的,但是不是

 

這是庫:

這是表和字段:

CREATE TABLE `nanchang_metro` (
  `station_id` int NOT NULL AUTO_INCREMENT,
 `line_name` varchar(20) COLLATE utf8mb4_general_ci NOT NULL, `station_name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, `next_station` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, `direction` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (`station_id`)
) ENGINE=InnoDB AUTO_INCREMENT=196 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

 

然后我檢查了Collation變量,發現Connection設置的規則,有是0900ci

mysql> show variables where Variable_name like 'collation%'; +----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.01 sec)

mysql> 

然后百度搜怎么配置這個connection

在my.ini配置文件中已經如下聲明具體的規則和字符集:

[mysqld]
# mysql所在的目錄
basedir=E:\mysql-8.0.23-winx64

# mysql 數據庫存儲的目錄
datadir=E:\mysql-8.0.23-winx64\data\

# mysql服務端默認使用的字符集
character-set-client-handshake = FALSE 
character-set-server=utf8mb4 collation-server=utf8mb4_general_ci init_connect = 'SET NAMES utf8mb4 COLLATE server=utf8mb4_general_ci'


# 默認使用的存儲引擎
default-storage-engine=INNODB

# mysql服務端的端口號 默認3306
port=3308

# 配置二進制日志格式
binlog_format = MIXED

# 允許導入導出
secure_file_priv = ''

[mysql] # mysql客戶端默認使用的字符集 default-character-set=utf8mb4 [client] default-character-set=utf8mb4

重啟服務后確實能指定collation_server

但是connection就是指定不了,就是很奇怪

 

 

然后我一想,連接的是Navicat來操作,是不是Navicat配置的問題
果然啊,一找才知道TNND,Navicat自動配置的是按照MySQL默認的排序規則走的

更改成UTF-8:

 

再次配置查看,就發現都一致了

mysql> show variables where Variable_name like 'collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.01 sec)

mysql> 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM