11 Stimmen

Ist es sicher, Strings mit "größer als" und "kleiner als" in MySQL zu vergleichen?

MySQL (5.1.41-3ubuntu12.10-log) scheint beim String-Vergleich mit > (größer als) und < (kleiner als) vorhersehbare Ergebnisse zu liefern:

select "a" > "a", "a" > "b", "b" > "a", "ab" > "aa", "ab" > "aabbbb";
+-----------+-----------+-----------+-------------+-----------------+
| "a" > "a" | "a" > "b" | "b" > "a" | "ab" > "aa" | "ab" > "aabbbb" |
+-----------+-----------+-----------+-------------+-----------------+
|         0 |         0 |         1 |           1 |               1 | 
+-----------+-----------+-----------+-------------+-----------------+

und scheint auch Schlüssel zu verwenden:

explain select productcode from products where productcode < 'no'; 
+----+-------------+----------+-------+-----------------+------+---------+------+------+--------------------------+
| id | select_type | table    | type  | possible_keys   | key  | key_len | ref  | rows | Extra                    |
+----+-------------+----------+-------+-----------------+------+---------+------+------+--------------------------+
|  1 | SIMPLE      | products | range | productcode,ppp | ppp  | 34      | NULL |  432 | Using where; Using index |
+----+-------------+----------+-------+-----------------+------+---------+------+------+--------------------------+

Dies scheint nicht dokumentiert zu sein - handelt es sich um eine verlässliche plattformübergreifende Funktion?

5voto

DhruvPathak Punkte 40485

Ich denke, es gibt einige Probleme, die Sie in der Dokumentation hier nachlesen können:

http://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html

Wenn Ihre Felder auch Nullwerte haben, sollten Sie auch einen Blick auf den null-sicheren Vergleichsoperator werfen: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

Beispiel:

mysql> select "a" > "a ", "A" > "a" , "aB"  > "ab" , "a" >= NULL , "a" <=> NULL ;
+------------+-----------+--------------+-------------+--------------+
| "a" > "a " | "A" > "a" | "aB"  > "ab" | "a" >= NULL | "a" <=> NULL |
+------------+-----------+--------------+-------------+--------------+
|          0 |         0 |            0 |        NULL |            0 |
+------------+-----------+--------------+-------------+--------------+

1voto

Nick Rolando Punkte 25704

Diese Vergleiche sind üblich. Ich bin sicher, dass der Vergleich von Zeichenketten nach dem Ascii-Wert oder einer anderen Kodierung plattformübergreifend unterstützt wird. Leider habe ich keine Ressourcen, um das zu belegen. Das ist wahrscheinlich die Art und Weise, wie Strings intern verglichen werden (zum Sortieren und so). Ich würde erwarten, dass dies eine dominante Funktion ist.

0voto

rmoestl Punkte 2879

Kurz gesagt: Dies ist aufgrund des Sortieralgorithmus der beteiligten Unternehmen vorhersehbar. Kollation(en) .

Über den Vergleich im Allgemeinen

Von der MySQL-Typ-Konvertierung wie die Konvertierung bei Vergleichsoperationen erfolgt":

Wenn beide Argumente in einer Vergleichsoperation Zeichenketten sind, werden sie als Strings verglichen .

Verglichen als String bezieht sich auf den Sortieralgorithmus des Kollation(en) der beteiligten Werte/Spalten.

Über die beteiligten Mehrfachabgleiche

Was geschieht, wenn zwei Operanden (Spalten, Literale ...) mit unterschiedlichen Sortierungen verglichen werden? Siehe MySQL Kollationskodierung .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X