希望文章能給到你啟發和靈感~
如果覺得文章對你有幫助的話,點贊 + 關注+ 收藏 支持一下博主吧~
閱讀指南
- 開篇說明
- 一、基礎環境說明
- 1.1 硬件環境
- 1.2 軟件環境
- 二、報錯信息
- 三、最后
開篇說明
記錄一個查詢錯誤
場景:數據庫之間某表復制移動;復制源數據庫能正常使用,復制后的數據庫在進行聯表
查詢時出現的關于數據庫排序規則
相關的異常報錯;
一、基礎環境說明
考慮環境因素,大家適當的對比自己的軟硬件環境情況分析~請仔細閱讀硬件、軟件環境
1.1 硬件環境
MacOS Monterey 版本 12.6.8 Apple M1
1.2 軟件環境
開發工具:Idea 2021
,navicat 15
編譯環境:Java 1.8.0_171
,mybatis 3.0+
數據庫:mysql8.0
二、報錯信息
Cause: java.sql.SQLException: Illegal mix of
collations
(utf8mb4_general_ci,IMPLICIT
) and (utf8mb4_0900_ai_ci,IMPLICIT
) for operation ‘=’
; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1267]; Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation ‘=’; nested exception is java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation ‘=’
從異常錯誤信息,能定位到問題出錯的點在于sql查詢,錯誤相關是排序規則的問題;
【1】首先確認我們的數據庫兩邊這塊的配置是否是一致的;
【2】定位到我們的查詢語句是哪句SQL;例如我這里是涉及多張表的聯表查詢;
SELECTa.id AS "id",a.create_by AS "createBy.id",a.create_date AS "createDate",a.update_by AS "updateBy.id",a.update_date AS "updateDate",a.remarks AS "remarks",a.del_flag AS "delFlag",a.materialId AS "materialId",m.model AS "model",a.machineNo AS "machineNo",m.materialname AS "materialName",m.materialcode AS "materialCode",m.voltage AS "voltage",m.unit AS "unit",s.status AS "status",a.isWaste AS "isWaste",a.maintenance_time AS "maintenanceTime",a.maintenance_content AS "maintenanceContent"FROM ossc_maintenance aINNER JOIN ossc_material m ON (m.id = a.materialId)INNER JOIN ossc_stock_detail s ON (a.machineNo = s.machine_no)
通過命令查詢兩個數據庫的相關表是否有存在數據排序的規則的沖突和不同;
然后我們主要用命令修改有區別的表的排序規則即可;
// 查詢所有與排序規則(collation)相關的系統變量
show variables like 'collation_%';
// 查看某個表(假設表名為table_name)的創建語句,包括其字符集(character set)和排序規則(collation)等詳細信息
show create table ossc_stock_detail;
// 修改了表的默認字符集和校對規則,并轉換了表中所有列和數據的字符集和校對規則
ALTER TABLE ossc_material convert to CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
三、最后
【1】show variables like ‘collation_%’; 該命令在不同版本mysql或配置中返回的可能不同
;如我這里是返回:
collation_connection:代表當前連接的排序規則。
collation_database:代表當前數據庫的默認排序規則。
collation_server:代表服務器的默認排序規則。
其他可能的返回值:
character_set_connection:代表當前連接的字符集。
character_set_database:代表當前數據庫的默認字符集。
character_set_results:代表查詢結果的字符集。
character_set_server:代表服務器的默認字符集。
character_set_system:代表系統元數據的字符集(通常是utf8,且不可更改)。
collation_client:代表客戶端的排序規則,這通常與character_set_connection和collation_connection相對應
【2】在做數據庫的復制移動時,要注意兩個庫之間的排序規則和字符集;