是否有允許表情符號和口音的 MySQL 字元集和編碼?
我有一個由一組使用者添加並由另一組使用者查詢的術語數據庫。
當人們在數據庫中查詢表情符號並且我的 React 應用程序會拋出錯誤時,我遇到了問題(奇怪的是 CORS 錯誤,但這是一個不同的問題)。我最終通過將表的字元集更改
utf8mb4
為utf8mb4_unicode_ci
排序規則解決了這個問題。現在我在添加新術語時遇到錯誤,例如,“beyoncé”的重複行已經存在。但是,當我在數據庫中查詢“beyoncé”時,它會返回其中包含“beyonce”的行。是否有可以正確處理此問題的字元集和排序規則的組合?
我的數據庫是在 Amazon RDS 上執行的 MySQL 5.6.40。
當人們在數據庫中查詢表情符號並且我的 React 應用程序會拋出錯誤時,我遇到了問題
確切的錯誤資訊是什麼?在您將其更改為
utfmb4
and之前,該列的字元集和排序規則是utf8mb4_unicode_ci
什麼?在 MySQL 中,排序規則可以設置在許多級別,包括客戶端連接。也就是說,Unicode(
utf8
作為 Unicode 編碼之一)支持所有字元。如果您的字元集確實是utf8mb4
,則無需更改。你說:
添加新術語時出現錯誤,例如“beyoncé”的重複行已經存在,但是當我在數據庫中查詢“beyoncé”時,它會返回其中包含“beyonce”的行。
MySQL 文件指出:
對於未指定區分重音的非二進制排序規則名稱,它由區分大小寫決定。如果排序規則名稱不包含
_ai
or_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
到一個或多個查詢來使用二進制排序規則。