在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>