Mysql

MariaDB 上 UTF8 中的索引衝突

  • March 10, 2022

我在將數據庫從 SQLite3 移動(轉換)到在 Synology NAS 上執行的 MariaDB 10.3.29 伺服器時遇到問題。

一張表actor有 3 列

  • 演員 ID
  • 姓名
  • 藝術網址

一些演員在 SQLite 3 DB 中有 2 個條目,一個是英語化的名字,比如 Sinead Matthews,另一個是特殊字元,Sinead Matthews。actor_id 是主鍵,所以沒關係。但是該模式會根據名稱創建一個唯一索引。MariaDB 上創建索引的(對我而言)黑盒將兩種形式視為相同,並產生引發錯誤的衝突。

錯誤 1062 (23000):重複條目 ‘Sinead Matthews’ 鍵 ‘ix_actor_1’

我的 MariaDB 使用 utf8 作為字元集。我用特殊字元插入了 1 行。選擇查詢顯示帶有特殊字元的名稱。然後嘗試插入名稱沒有特殊字元的行會引發錯誤。

我該如何解決這個問題?

我認為你有更多的排序規則問題而不是字元集問題。您知道 SQLite 中的排序規則是什麼,現在 MariaDB 實例中的排序規則是什麼嗎?

您可以將 MariaDB 中的排序規則更改為更合適的排序規則,例如latin1_swedish_ci我認為允許插入第二行的預設值(將這兩個值視為不同的值)。可以在伺服器、數據庫、表和列級別指定排序規則。

如果您想在數據庫級別更改它,這通常是最合適的(即您通常應該在整個數據庫中使用相同的排序規則),您可以使用ALTER DATABASE命令來完成。例如:

ALTER DATABASE YourDatabaseName CHARACTER SET='latin1'  COLLATE='latin1_swedish_ci';

作為參考,這裡也是MariaDB 支持的字元集列表,latin1是預設值。

引用自:https://dba.stackexchange.com/questions/308272