🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.bazy-danych
Article #183517

Re: pytanie o operatory porównania

#183517
From: Filip Rembiałkowski
Date: Mon, 20 Jul 2009 17:30
73 lines
3738 bytes
On 15 Lip, 14:07, Tomasz <spamt...@rac.pl> wrote:
> Witam,
>
> Nadszedł taki czas, że po wielu latach programowania okazuje się, że
> muszę zapytać o coś co wydawało mi się, że wiem (podstawy).
>
> W jaki sposób porównywane są napisy za pomocą operatorów '<' i '>' ?
> Sprawa dotyczy mysql i pól varchar. Jaki jest 'algorytm' porównywania?
> Chodzi mi o przypadki przy WHERE np. pole1 > 'ala'.
> Oczywiście w pole1 są różne wartości o różnej długości (w tym liczby).


zasadniczo typy napisowe (char varchar itp itd) są porównywane znak po
znaku zgodnie z obowiązującym porządkiem (collation).

więc "algorytm" jest taki:

dane masz napisy a i b,
jesli ktorykolwiek jest NULL-em o zwróć NULL. KONIEC
j:= 0 (zero, indeks pierwszego znaku)
weź kolejny znak z obu napisów, a[j] i b[j]
jesli nie ma a[j] ani b[j] to znaczy ze napisy sa rowne. KONIEC.
jeśli a[j] < b[j] (wg aktualnego collation) to znaczy że a jest
mniejsze. KONIEC.
jeśli a[j] > b[j] (wg aktualnego collation) to znaczy że a jest
większe. KONIEC.
jeśli nie ma a[j] to znaczy że a jest krótsze a więc mniejsze. KONIEC
jeśli nie ma b[j] to znaczy że b jest krótsze a więc mniejsze. KONIEC
jesli a[j]=b[j] to przejdź do kolejnego znaku j+1



trzeba uważać z liczbami. w mysql sprawa jest śliska:

mysql> select 123 > 'ala';
+-------------+
| 123 > 'ala' |
+-------------+
|           1 |
+-------------+
1 row in set, 1 warning (0,00 sec)

mysql> select  'ala' < 123;
+-------------+
| 'ala' < 123 |
+-------------+
|           1 |
+-------------+
1 row in set, 1 warning (0,00 sec)
(mysql 5.0.
jak widać zwraca zupełnie sprzeczne wyniki dla pozornie takich samych
porównań.



w postgresie dla odmiany, od wersji 8.3 wzwyż takie operacje ( które
potencjalnie mogą dać błędny wynik z powodu niejawnego rzutowania
tekstu na liczbę lub odwrotnie) spowodują błąd:

filip@filip=# select 123 > 'ala';
ERROR:  invalid input syntax for integer: "ala"
LINE 1: select 123 > 'ala';
                     ^
filip@filip=# select 'ala' < 123;
ERROR:  invalid input syntax for integer: "ala"
LINE 1: select 'ala' < 123;

ale już po jawnym zrzutowaniu na tekst, zachowuje się poprawnie:
filip@filip=# select '123' > 'ala', 'ala' < '123';
 ?column? | ?column?
----------+----------
 f        | f
(1 row)
Technical Details
Message-ID: <d6d28986-ca50-4540-9931-590f4b3dc58b@d32g2000yqh.googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!feed.news.interia.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!t-online.de!border2.nntp.dca.giganews.com!nntp.giganews.com!postnews.google.com!d32g2000yqh.googlegroups.com!not-for-mail
References: <h3khdp$niq$1@nemesis.news.neostrada.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!feed.news.interia.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!t-online.de!border2.nntp.dca.giganews.com!nntp.giganews.com!postnews.google.com!d32g2000yqh.googlegroups.com!not-for-mail
From: Filip Rembiałkowski <plk.zuber@gmail.com>
Newsgroups: pl.comp.bazy-danych
Subject: Re: pytanie o operatory porównania
Date: Mon, 20 Jul 2009 10:30:37 -0700 (PDT)
Organization: http://groups.google.com
Lines: 82
Message-ID: <d6d28986-ca50-4540-9931-590f4b3dc58b@d32g2000yqh.googlegroups.com>
References: <h3khdp$niq$1@nemesis.news.neostrada.pl>
NNTP-Posting-Host: 83.3.6.217
Mime-Version: 1.0
X-Trace: posting.google.com 1248111037 27259 127.0.0.1 (20 Jul 2009 17:30:37 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Mon, 20 Jul 2009 17:30:37 +0000 (UTC)
Cc: Filip Rembiałkowski <plk.zuber@gmail.com>
Complaints-To: groups-abuse@google.com
Injection-Info: d32g2000yqh.googlegroups.com; posting-host=83.3.6.217;  posting-account=7hM8qQoAAADKnMdmST1pb0WWa0872-qz
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.0.11)  Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729),gzip(gfe),gzip(gfe)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit