簡體   English   中英

如何對 SQL 查詢進行排序,但將某些 UTF-8 字符排序為正常等效字符? (例如É被視為E等)

[英]How can I sort an SQL query but have certain UTF-8 characters be ordered as their normal equivalent? (e.g. É be regarded as E etc)

我在 mySQL 數據庫中有一個字符名稱表。

我正在嘗試查詢表格並按名稱按字母順序對它們進行排序。

一些字符的名稱如“The Dagda”和“The”需要被忽略,所以我嘗試使用:

select character_id, name from characters where is_del=0 order by trim('The ' from name)

這似乎工作......

其他一些字符的名稱中包含 UTF-8 字符,例如“Ériu”

但是,現在當我的表被返回時,我會在“A”和“B”之間列出這些“É”條目。

IE:

Aengus Amergin Ériu Balor Banba 等

保留這些 UTF 字符在前端至關重要。

有誰知道一種方法,我可以將這些“É”字符和類似字符表示為“E”以進行排序,但仍會在數據集中呈現它們的實際情況?

在問這個問題之前我在想這可能是不可能的,但我希望這里的某個人之前可能遇到過類似的問題並且可能有解決方法。

提前致謝。

編輯:將 UTF-16 更改為 UTF-8(我的錯)

編輯@Rick James:

我無法在評論中以可讀的方式格式化它,但查詢的十六進制如下:

姓名 | 十六進制(名稱)

安格斯·格 | 41656E67757320C383E2809C67
阿美金 | 416D657267696E
らriu | C383E280B0726975
巴洛爾 | 42616C6F72
板壩 | 42616E6261

向下的第 3 項是 Ériu - 我不確定它們為什么會像上面那樣呈現,但這是當我運行查詢select character_id, name, hex(name) from characters order by trim('The ' from name)

第一個角色的全名應該是 Aengus Óg (我假設這又歸結為字符集或排序規則,但我不確定是否為我在這里的無知而道歉)

“雙重編碼”似乎是問題所在。 我在UTF-8 字符的麻煩中對此進行了一些討論; 我看到的不是我存儲的

應該`

41 65 6E 67 75 73 20 C383 E2809C 67

Óg是 UTF-8 中的十六進制C393 67

Latin1 hex C3 93 67Óg

重復得到C383 E2809C 67

CONVERT(BINARY(CONVERT('Aengus Óg' USING latin1))
               USING utf8mb4) --> 'Aengus Óg'

這似乎是“雙重編碼”:

CONVERT(BINARY(CONVERT(CONVERT(UNHEX('C383E280B0726975') USING utf8mb4) USING latin1)) USING utf8mb4) --> 'Ériu'

Ériu作為中間步驟。 這解釋了為什么它與 A 排序。

這是一個常見的問題。 它經常被忽視,因為瀏覽器“修復”了混亂。

對表進行 SELECT 試驗。 如果第一個適合您,那么它就是 Mojibake。

SELECT CONVERT(BINARY(CONVERT(my_column USING latin1))
               USING utf8mb4)
    FROM ... WHERE ...;

閱讀其他問答,了解哪些步驟出錯導致問題。 它可能涉及將 UTF-8 字符存儲在聲明為latin1的列中。

ALTER TABLE ... CONVERT TO ...假定數據已正確存儲。 但事實並非如此。 現在您已在列上正確設置了CHARACTER SET ,但其中的數據已被 Mojibaked。 所以,它需要類似的東西

UPDATE tbl  SET
    col1 = CONVERT(BINARY(CONVERT(col1 USING latin1))
           USING utf8mb4),
    col2 = CONVERT(BINARY(CONVERT(col2 USING latin1))
           USING utf8mb4),
    ...
    ;

有關修復的更多信息:http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases

回滾? 如果您更願意回滾到 CONVERT TO 之前,那么忽略我之前所說的大部分內容,那么您需要在回滾之后進行 2 步 ALTER。 (請參閱該博客鏈接。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM