2012-04-15 40 views
2

是否可以強制查詢區分大小寫?MySQL查詢 - 使用ORDER BY強制區分大小寫rand()

礦聽起來像這樣:

"SELECT g_path FROM glyphs WHERE g_glyph = :g_glyph ORDER BY rand()" 

如果g_glyph = R,其結果可能是R或R,它不是我所期望的。 我正在尋找一個區分大小寫的回報。

我GOOGLE了我的問題,我發現這個解決方案:

/*Case-sensitive sort in descending order. 
In this query, ProductName is sorted in 
case-sensitive descending order. 
*/ 
SELECT ProductID, ProductName, UnitsInStock 
FROM products 
ORDER BY BINARY ProductName DESC; 

但下面的行不會在所有的工作:

"SELECT g_path FROM glyphs WHERE g_glyph = :g_glyph ORDER BY BINARY rand()" 

什麼建議嗎?

非常感謝您的幫助。

+0

你有g_glyph聲明爲二進制? – riso 2012-04-15 08:27:58

+0

你的專欄有什麼整理? – 2012-04-15 08:31:31

+0

謝謝你對我的問題感興趣。 Gumbo的解決方案完美運作。 – Zorkzyd 2012-04-15 08:56:41

回答

4

字符的順序和相等性由collation定義。在大多數情況下,使用不區分大小寫的排序規則。

如果你需要使用一個嚴格的,區分大小寫的比較特定數據,使用BINARY operator

mysql> SELECT 'a' = 'A'; 
     -> 1 
mysql> SELECT BINARY 'a' = 'A'; 
     -> 0 
mysql> SELECT 'a' = 'a '; 
     -> 1 
mysql> SELECT BINARY 'a' = 'a '; 
     -> 0 

所以你的情況:

SELECT g_path FROM glyphs WHERE BINARY g_glyph = :g_glyph ORDER BY rand() 
+0

非常感謝你的Gumbo! 這正是我需要的! – Zorkzyd 2012-04-15 08:53:21

2

這包括在手冊頁Case Sensitivity in String Searches

您需要指定區分大小寫或二進制排序規則。

默認字符集和排序規則是latin1和latin1_swedish_ci,所以非二進制字符串比較默認情況下不區分大小寫。這意味着如果使用col_name LIKE'a%'進行搜索,則會獲得以A或a開頭的所有列值。要使搜索區分大小寫,請確保其中一個操作數具有區分大小寫或二進制排序規則。例如,如果您比較一列和一個字符串,都有latin1字符集,你可以使用COLLATE操作符,使操作具有latin1_general_cs或latin1_bin校對特性:

col_name COLLATE latin1_general_cs LIKE 'a%' 
col_name LIKE 'a%' COLLATE latin1_general_cs 
col_name COLLATE latin1_bin LIKE 'a%' 
col_name LIKE 'a%' COLLATE latin1_bin 

如果你想要一個列總是要以區分大小寫的方式進行處理,並使用區分大小寫或二進制排序規則進行聲明。請參見第13.1.14節「CREATE TABLE語法」。

整理名稱中的_cs代表「區分大小寫」。

+0

謝謝你的回答。 我的DB規格: - 類型:InnoDB的 - interclassement:utf8_general_ci 如果我只是改變interclassement utf8_general_ci到utf8_bin,我可以得到預期的結果(區分大小寫的結果),或者必須將我的DB的所有數據? – Zorkzyd 2012-04-15 08:46:02

+0

「_ci」表示不區分大小寫。您應該使用區分大小寫(_cs)。Bin表示二進制比較,它比區分大小寫更嚴格。 – 2012-04-15 10:33:31

+0

謝謝你的解釋! – Zorkzyd 2012-04-16 06:33:37