Mysql

是否有允許表情符號和口音的 MySQL 字元集和編碼?

  • September 26, 2019

我有一個由一組使用者添加並由另一組使用者查詢的術語數據庫。

當人們在數據庫中查詢表情符號並且我的 React 應用程序會拋出錯誤時,我遇到了問題(奇怪的是 CORS 錯誤,但這是一個不同的問題)。我最終通過將表的字元集更改utf8mb4utf8mb4_unicode_ci排序規則解決了這個問題。

現在我在添加新術語時遇到錯誤,例如,“beyoncé”的重複行已經存在。但是,當我在數據庫中查詢“beyoncé”時,它會返回其中包含“beyonce”的行。是否有可以正確處理此問題的字元集和排序規則的組合?

我的數據庫是在 Amazon RDS 上執行的 MySQL 5.6.40。

當人們在數據庫中查詢表情符號並且我的 React 應用程序會拋出錯誤時,我遇到了問題

確切的錯誤資訊是什麼?在您將其更改為utfmb4and之前,該列的字元集和排序規則是utf8mb4_unicode_ci什麼?在 MySQL 中,排序規則可以設置在許多級別,包括客戶端連接。

也就是說,Unicode(utf8作為 Unicode 編碼之一)支持所有字元。如果您的字元集確實是utf8mb4,則無需更改。

你說:

添加新術語時出現錯誤,例如“beyoncé”的重複行已經存在,但是當我在數據庫中查詢“beyoncé”時,它會返回其中包含“beyonce”的行。

MySQL 文件指出:

對於未指定區分重音的非二進制排序規則名稱,它由區分大小寫決定。如果排序規則名稱不包含_aior _as_ci則顧名思義_ai_cs顧名思義_as

因此,既然您的排序規則是*,*utf8mb4_unicode_ci那麼它既不區分大小寫又不區分重音。這就是“beyoncé”匹配“beyonce”的原因。

如果您需要將“beyoncé”和“beyonce”視為不同,那麼理想情況下,您將使用區分大小寫(以及明確聲明或隱含的重音敏感)排序規則。但是,看起來這在 MySQL 5.6(甚至 5.7)中不可用,而 MySQL 8.0 確實有utf8mb4_0900_as_cs,或者即使utf8mb4_0900_as_ci您只希望重音來區分值,同時允許“beyonce”和“Beyonce”匹配。

因此,目前看來,您可能需要utf8mb4_bin通過更改列的排序規則或添加COLLATE utf8mb4_bin到一個或多個查詢來使用二進制排序規則。

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