2012-07-24 52 views
1

我在MySQL數據庫中有一個varchar列,它存儲了一些可以包含任何字符和數字的文本。對varchar列中包含文本和數字的數據進行排序

該模式使用utf8作爲字符集,utf8_unicode_ci作爲歸類。因爲我需要使用事務,因此使用InnoDB作爲數據庫引擎。

我想要做的是能夠以自然的方式ORDER BY該列。例如,這裏的一些樣本數據:

12234 some random text 
my text 23 
mytext3 
123456abcd 
text23 
text1 
text111 
text33 

測試數據插入測試表後,我運行一個查詢和ORDER BYvarcharASC

SELECT * FROM `test` WHERE 1 ORDER BY data ASC; 

的問題是,「大小「這些數字都沒有考慮到:

12234 some random text 
123456abcd 
my text 23 
mytext3 
text1 
text111 <------- 
text23 
text33 

然後我發現這個question這裏其中規定的(阿爾莫st)解決方案:

SELECT * FROM `test` WHERE 1 ORDER BY data * 1 DESC; 

123456abcd    <------ These 2 should 
12234 some random text <------ be swapped 
my text 23 
mytext3 
text23 
text1 
text33 
text111 

上述的另一個缺點是上面的代碼不能使用任何索引,因爲每行都有一個操作。

我也不確定一旦我們引入非拉丁字符,效果會是什麼樣子。

是否有一種高性能的方式讓MySQL執行自然語言排序?

+0

我有點困惑。如果是按照DESC排序,那麼在12234之前不會有123456 shd? – sel 2012-07-24 01:15:41

+0

這是因爲我按照鏈接的問題執行'ORDER BY data * 1'。 – F21 2012-07-24 01:18:42

+0

[自然排序在MySQL]中可能的重複(http://stackoverflow.com/questions/153633/natural-sort-in-mysql) – outis 2012-07-24 01:41:22

回答

0

你問:

Is there a performant way to get MySQL to perform natural language sorting? 

簡短的回答:沒有。

較長的答案:

想必你希望MySQL整理你的日期在處理使用所選擇的整理和數字文本,就像它是二進制數的非數字文本的方式。

您將需要創建一個用於整理的某種代理鍵,並將其存儲在自己的列中。您可以通過像這樣轉換每個文本字符串來執行此操作,並將原始字符串和代理鍵字符串加載到dbms中。

Original Text     Surrogate Key Text 
12234 some random text   0000012234 some random text 
my text 23      my text 0000000023 
mytext3       mytext0000000003 
123456abcd      000abcd 
text23       text0000000023 
text1       text0000000001 
text111       text0000000111 
text33       text0000000033 
1text123      0000000001text000000
2text124      0000000002text0000000124 

注意到你的樣品中的數字數據的每個塊的,在這個例子中,塞進十位十進制數。

這是加載數據庫管理系統時最容易在您的應用程序中執行的操作。你可以編寫一個簡單的字符串解析例程來完成它。您沒有告訴我們您使用的是哪種應用程序語言。

如果您僅對每個查詢中的有限數量的記錄進行整理,那麼在您檢索記錄後,也可以在應用程序中執行該記錄。

相關問題