欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL 5.7升級8.0后出現(xiàn)排序規(guī)則問題的解決方案匯總

 更新時間:2024年06月28日 08:57:20   作者:愛可生開源社區(qū)  
MySQL 5.7.34 升級到 8.0.32 后部分查詢語句報錯如下,ERROR 1267 (HY000),比較操作中使用不同的字符集或排序規(guī)則通常會觸發(fā)此問題,所以本文給大家介紹了MySQL 5.7升級8.0后出現(xiàn)排序規(guī)則問題的解決方案匯總,需要的朋友可以參考下

比較操作中使用不同的字符集或排序規(guī)則通常會觸發(fā)此問題,MySQL 8.0 默認 COLLATE 為 utf8mb4_0900_ai_ci 和 對應列 COLLATE 的 utf8mb4_general_ci 不匹配。

問題現(xiàn)象

MySQL 5.7.34 升級到 8.0.32 后部分查詢語句報錯如下:

ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation 'find_in_set'

問題原因

比較操作中使用不同的字符集或排序規(guī)則通常會觸發(fā)此問題,MySQL 8.0 默認 COLLATE 為 utf8mb4_0900_ai_ci 和 對應列 COLLATE 的 utf8mb4_general_ci 不匹配。

問題重現(xiàn)過程

創(chuàng)建測試表。

CREATE TABLE `t01` (
  `ID` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `A_CODE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  `B_CODE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

執(zhí)行查詢語句。

SELECT AAA.* FROM(
SELECT 
@xxx AS _xxx,
( SELECT @xxx := GROUP_CONCAT( A_CODE ) FROM t01 WHERE FIND_IN_SET( B_CODE, @xxx ) ) AS cxxx
FROM
t01,( SELECT @xxx := 'xxx') b
WHERE @xxx IS NOT NULL) ID,t01 AAA
WHERE
FIND_IN_SET( AAA.A_CODE, ID._xxx )
order by A_CODE;

報錯。

ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation 'find_in_set'

問題分析

查看默認排序規(guī)則。

mysql> show collation like 'utf8mb4_0900_ai_ci';
+--------------------+---------+-----+---------+----------+---------+---------------+
| Collation          | Charset | Id  | Default | Compiled | Sortlen | Pad_attribute |
+--------------------+---------+-----+---------+----------+---------+---------------+
| utf8mb4_0900_ai_ci | utf8mb4 | 255 | Yes     | Yes      |       0 | NO PAD        |
+--------------------+---------+-----+---------+----------+---------+---------------+
1 row in set (0.00 sec)

mysql> show collation like 'utf8mb4_general_ci';
+--------------------+---------+----+---------+----------+---------+---------------+
| Collation          | Charset | Id | Default | Compiled | Sortlen | Pad_attribute |
+--------------------+---------+----+---------+----------+---------+---------------+
| utf8mb4_general_ci | utf8mb4 | 45 |         | Yes      |       1 | PAD SPACE     |
+--------------------+---------+----+---------+----------+---------+---------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.COLLATIONS WHERE IS_DEFAULT='Yes' and CHARACTER_SET_NAME='utf8mb4';
+--------------------+--------------------+-----+------------+-------------+---------+---------------+
| COLLATION_NAME     | CHARACTER_SET_NAME | ID  | IS_DEFAULT | IS_COMPILED | SORTLEN | PAD_ATTRIBUTE |
+--------------------+--------------------+-----+------------+-------------+---------+---------------+
| utf8mb4_0900_ai_ci | utf8mb4            | 255 | Yes        | Yes         |       0 | NO PAD        |
+--------------------+--------------------+-----+------------+-------------+---------+---------------+
1 row in set (0.00 sec)

查看相關參數(shù)。

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

其中:
mysql> show global variables like '%collation%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | utf8mb4_general_ci |
| collation_database            | utf8mb4_general_ci |
| collation_server              | utf8mb4_general_ci |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set (0.00 sec)

查看配置文件參數(shù)。

mysql@CJC-DB-01:/home/mysql$cat /etc/my.cnf 
......
[mysqld]
collation_server = utf8mb4_general_ci

可以看到,客戶端局部會話變量 collation_connection 的值為 utf8mb4_0900_ai_ci,而全局變量值為 utf8mb4_general_ci,兩者不一致。

這是由于服務端在客戶端連接時,獲取了客戶端對字符集和排序規(guī)則的缺省設置,也就是 utf8mb4_0900_ai_ci。

解決方案

  • 修改參數(shù)
  • 修改表 COLLATE
  • 修改 SQL 語句

1. 修改參數(shù)

參數(shù)collation_connection 在客戶端局部變量值和全局變量值不一致,如何改成一致?官網(wǎng)參考材料

--character-set-client-handshake
Command-Line Format:--character-set-client-handshake[={OFF|ON}]
Deprecated:8.0.35
Type:Boolean
Default Value:ON

參數(shù)說明

  • 不忽略客戶端發(fā)送的字符集信息
  • 為了忽略客戶端信息并使用默認的服務器字符集
  • 使用參數(shù):--skip-character-set-client-handshake

此選項在 MySQL 8.0.35 及更高版本的 MySQL 8.0 中已被棄用。在該版本中,無論何時使用此選項,都會發(fā)出警告,并將在未來版本的 MySQL 中刪除。

依賴此選項的應用程序應該盡快開始遷移。

添加 my.cnf 參數(shù)。

[mysqld]
skip-character-set-client-handshake

重啟 MySQL。

mysqladmin -uroot -p****** shutdown
mysqld --defaults-file=/etc/my.cnf --user=mysql &

登錄

mysql -uroot -p cjc

查看參數(shù),collation_connection 參數(shù)值修改成功

mysql> show global variables like '%collation%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | utf8mb4_general_ci |
| collation_database            | utf8mb4_general_ci |
| collation_server              | utf8mb4_general_ci |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set (0.00 sec)

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

再次執(zhí)行,問題解決。

SELECT AAA.* FROM(
SELECT 
@xxx AS _xxx,
( SELECT @xxx := GROUP_CONCAT( A_CODE ) FROM t01 WHERE FIND_IN_SET( B_CODE, @xxx ) ) AS cxxx
FROM
t01,( SELECT @xxx := 'xxx') b
WHERE @xxx IS NOT NULL) ID,t01 AAA
WHERE
FIND_IN_SET( AAA.A_CODE, ID._xxx )
order by A_CODE;
Empty set, 2 warnings (0.00 sec)

2. 修改表 COLLATE

先改回原參數(shù),查詢報錯。

SELECT AAA.* FROM(
SELECT 
@xxx AS _xxx,
( SELECT @xxx := GROUP_CONCAT( A_CODE ) FROM t01 WHERE FIND_IN_SET( B_CODE, @xxx ) ) AS cxxx
FROM
t01,( SELECT @xxx := 'xxx') b
WHERE @xxx IS NOT NULL) ID,t01 AAA
WHERE
FIND_IN_SET( AAA.A_CODE, ID._xxx )
order by A_CODE;
ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation 'find_in_set'

修改表排序規(guī)則。

mysql> show create table t01\G;
*************************** 1. row ***************************
       Table: t01
Create Table: CREATE TABLE `t01` (
  `ID` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `A_CODE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  `B_CODE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)

ERROR: 
No query specified

修改所有列 COLLATE,實際上只修改 A_CODEB_CODE 列 COLLATE 也可解決此問題。

ALTER TABLE cjc.t01 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE cjc.t01 MODIFY COLUMN `ID` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL;
ALTER TABLE cjc.t01 MODIFY COLUMN `A_CODE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL;
ALTER TABLE cjc.t01 MODIFY COLUMN `B_CODE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL;

再次執(zhí)行,問題解決。

SELECT AAA.* FROM(
SELECT 
@xxx AS _xxx,
( SELECT @xxx := GROUP_CONCAT( A_CODE ) FROM t01 WHERE FIND_IN_SET( B_CODE, @xxx ) ) AS cxxx
FROM
t01,( SELECT @xxx := 'xxx') b
WHERE @xxx IS NOT NULL) ID,t01 AAA
WHERE
FIND_IN_SET( AAA.A_CODE, ID._xxx )
order by A_CODE;

Empty set, 2 warnings (0.00 sec)

查看表結構。

mysql> show create table t01\G;
*************************** 1. row ***************************
       Table: t01
Create Table: CREATE TABLE `t01` (
  `ID` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `A_CODE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `B_CODE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)

3. 修改 SQL 語句

將 A_CODE,B_CODE 列的 COLLATE 在 SQL 語句中轉換為 utf8mb4_0900_ai_ci。

改寫后的SQL如下:

SELECT AAA.* FROM(
SELECT 
@xxx AS _xxx,
( SELECT @xxx := GROUP_CONCAT( A_CODE COLLATE utf8mb4_0900_ai_ci ) FROM t01 WHERE FIND_IN_SET( B_CODE COLLATE utf8mb4_0900_ai_ci, @xxx ) ) AS cxxx
FROM
t01,( SELECT @xxx := 'xxx') b
WHERE @xxx IS NOT NULL) ID,t01 AAA
WHERE
FIND_IN_SET( AAA.A_CODE COLLATE utf8mb4_0900_ai_ci, ID._xxx )
order by A_CODE;

總結

比較三種解決方案,每種解決方案適用場景不同,請根據(jù)實際情況選擇解決方案。

  • 修改參數(shù)

    適用于數(shù)據(jù)庫是從 5.7 或更低版本升級到 8.0,并且表數(shù)量較多、數(shù)據(jù)量加大。不適用于批量修改所有表、列字符集和排序規(guī)則。

  • 修改表 COLLATE

    適用于修改過程會鎖表,數(shù)據(jù)量越大時間越長,使用于數(shù)據(jù)量小的場景,建議將所有表、列字符集和排序規(guī)則改成 8.0 默認值,后續(xù)新增表時不指定字符集和排序規(guī)則。

  • 修改 SQL 語句

    適用于臨時查詢,改SQL影響最小。

以上就是MySQL 5.7升級8.0后出現(xiàn)排序規(guī)則問題的解決方案匯總的詳細內容,更多關于MySQL 5.7升級8.0排序規(guī)則問題的資料請關注腳本之家其它相關文章!

相關文章

  • DBeaver連接MySQL提示"Public Key Retrieval is not allowed"問題解決方式

    DBeaver連接MySQL提示"Public Key Retrieval is

    dbeaver數(shù)據(jù)庫連接工具,可以支持幾乎所有的主流數(shù)據(jù)庫.mysql,oracle.sqlserver,db2 等等,這篇文章主要給大家介紹了關于DBeaver連接MySQL提示"Public Key Retrieval is not allowed"問題的解決方式,需要的朋友可以參考下
    2023-10-10
  • MySQL中的驅動表與被驅動表及含義

    MySQL中的驅動表與被驅動表及含義

    使用join連接查詢時如果有where條件,則MySQL執(zhí)行器會根據(jù)查詢條件過濾后的結果自動選擇驅動表或被驅動表,這篇文章主要介紹了MySQL的驅動表與被驅動表,需要的朋友可以參考下
    2023-10-10
  • Mysql字符集utf8和utf8mb4詳解

    Mysql字符集utf8和utf8mb4詳解

    文章介紹了MySQL中utf8和utf8mb4兩種字符集的區(qū)別,包括編碼方式、存儲空間、索引長度以及支持的Unicode字符范圍,同時,通過創(chuàng)建兩個表并插入數(shù)據(jù)進行存儲長度的比較,驗證了上述理論
    2024-12-12
  • MySQL鎖等待與死鎖問題分析

    MySQL鎖等待與死鎖問題分析

    這篇文章主要介紹了MySQL鎖等待與死鎖問題分析,幫助大家更好的理解和學習使用MySQL,感興趣的朋友可以了解下
    2021-03-03
  • mysql 8.0.17 安裝與使用教程圖解

    mysql 8.0.17 安裝與使用教程圖解

    這篇文章主要介紹了mysql 8.0.17 安裝與使用教程圖解,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • MySQL 8.0.18 穩(wěn)定版發(fā)布! Hash Join如期而至

    MySQL 8.0.18 穩(wěn)定版發(fā)布! Hash Join如期而至

    MySQL 8.0.18 穩(wěn)定版發(fā)布! Hash Join 如期而至,這篇文章帶大家快速瀏覽一下MySQL 8.0.18 穩(wěn)定版的各個亮點,感興趣的小伙伴們可以學習參考一下
    2019-10-10
  • 解決mybatis查詢結果為null時,值被默認值替換問題

    解決mybatis查詢結果為null時,值被默認值替換問題

    這篇文章主要介紹了解決mybatis查詢結果為null時,值被默認值替換問題。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 超出MySQL最大連接數(shù)問題及解決

    超出MySQL最大連接數(shù)問題及解決

    這篇文章主要介紹了超出MySQL最大連接數(shù)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • mysql 常用命令集錦[絕對精華]

    mysql 常用命令集錦[絕對精華]

    測試環(huán)境:mysql 5.0.45 【注:可以在mysql中通過mysql> SELECT VERSION();來查看數(shù)據(jù)庫版本】
    2009-06-06
  • MYSQL主從不同步延遲原理分析及解決方案

    MYSQL主從不同步延遲原理分析及解決方案

    這篇文章介紹了MYSQL主從不同步延遲原理分析及解決方案,有需要的朋友可以參考一下
    2013-09-09

最新評論