2012-04-15 11 views
2

Ist es möglich, Groß-und Kleinschreibung für eine Abfrage zu erzwingen?MySQL-Abfrage - erzwingen Groß-und Kleinschreibung mit einer ORDER BY rand()

-Mine klingt wie folgt aus:

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

wenn g_glyph = r, ist das Ergebnis R oder r sein kann, und es ist nicht das, was ich erwarte. Ich bin auf der Suche nach einer Groß-/Kleinschreibung.

gegoogelt ich mein Problem und ich fand diese Lösung:

/*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; 

Aber die folgende Zeile überhaupt nicht funktioniert:

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

Jeder Vorschlag?

Vielen Dank für Ihre Hilfe.

+0

haben Sie g_glyph als binäres erklärt ? – riso

+0

Welche Sortierung hat Ihre Spalte? –

+0

Vielen Dank für das Interesse an meinem Problem. Die Lösung von Gumbo funktioniert perfekt. – Zorkzyd

Antwort

4

Die Reihenfolge und die Gleichheit der Zeichen wird durch collation definiert. In den meisten Fällen wird eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung verwendet.

Wenn Sie einen strengen, Groß- und Vergleich für einen bestimmten Datum verwenden müssen, verwenden Sie die BINARY operator:

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

So in Ihrem Fall:

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

Vielen Dank Gumbo! Es ist genau das, was ich brauchte! – Zorkzyd

2

Dies wird in der Handbuchseite Case Sensitivity in String Searches behandelt.

Sie müssen eine case sensitive oder binäre Sortierung angeben.

Der Standardzeichensatz und die Sortierfolge sind latin1 und latin1_swedish_ci, daher wird bei nichtbinären Zeichenfolgenvergleichsoperationen standardmäßig die Groß- und Kleinschreibung nicht berücksichtigt. Das heißt, wenn Sie mit col_name LIKE 'a%' suchen, erhalten Sie alle Spaltenwerte, die mit A oder a beginnen. Stellen Sie sicher, dass einer der Operanden eine Groß-/Kleinschreibung oder Binärsortierung aufweist, um diese Suche für Groß- und Kleinschreibung zu sensibilisieren. Zum Beispiel, wenn Sie eine Spalte und eine Zeichenfolge vergleichen, die sowohl den Zeichensatz latin1 haben, können Sie die COLLATE-Operator verwenden entweder Operanden die latin1_general_cs oder latin1_bin haben:

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 

Wenn Sie eine Spalte wollen Um immer die Groß- und Kleinschreibung zu berücksichtigen, deklarieren Sie die Groß-/Kleinschreibung. Siehe Abschnitt 13.1.14, "CREATE TABLE-Syntax".

Die _cs im Kollatierungsname steht für "case sensitive".

+0

Vielen Dank für Ihre Antwort. My DB Daten: - Typ: InnoDB - interclassement: utf8_general_ci Wenn ich die interclassement utf8_general_ci nur ändern, um utf8_bin, kann ich das erwartete Ergebnis (case-sensitive Ergebnis) zu erhalten oder muss ich konvertieren alle meine DB-Daten? – Zorkzyd

+0

Das "_ci" bedeutet Groß- und Kleinschreibung. Sie sollten stattdessen Groß- und Kleinschreibung beachten (_cs).Bin bedeutet Ein binärer Vergleich, der strenger ist als die Groß-/Kleinschreibung. –

+0

Danke für die Erklärung! – Zorkzyd