mysql und die verwendung von indices

mysql und die verwendung von indices

am 28.12.2005 10:53:41 von Werner Bauer

Im Php erzeuge ich gern Abfragen, wo die Parameter "vorsichtshalber" in '
eingepackt werden.
zB .. where postleitzahl='2441'
Postleitzahl ist leider in der Datenbank als Varchr definiert obwohl
numerisch, und es gibt einen Index.
Nun dachte ich, wenn die Eingabe geprüfterweise numerisch ist, setz ich die
Abfrage als
where postleitzahl=2441 zusammen, und siehe da, der Index wird nicht
verwendet.
Mein Ergebnis genauerer Untersuchungen:
wenn des Feld numerisch ist, funktioniert eine Abfrage mit '' genausogut wie
eine ohne (Index wird berücksichtigt)
wenn das Feld als Char definiert ist, funktioniert eine numerische Eingabe
nicht, dH der Index wird nicht berücksichtigt.
Schlussfolgerung: die Abfragen immer mit ' formulieren ...

Re: mysql und die verwendung von indices

am 28.12.2005 11:32:42 von Helmut Chang

Werner Bauer schrieb:

> Postleitzahl ist leider in der Datenbank als Varchr definiert obwohl
> numerisch,...

Wie kommst du darauf? Postleitzahlen sind zugegebenermassen in D, A, CH,
etc. numerisch, aber nicht überall. Deshalb nimmt man im Normalfall
nimmt man eben (VAR)CHAR.

> ...und es gibt einen Index.

Gut.

> Nun dachte ich, wenn die Eingabe geprüfterweise numerisch ist, setz ich die
> Abfrage als
> where postleitzahl=2441 zusammen, und siehe da, der Index wird nicht
> verwendet.

Najo. In anderen RDBMS würdest du wahrscheinlich sogar einen Fehler
bekommen.

> Mein Ergebnis genauerer Untersuchungen:
> wenn des Feld numerisch ist, funktioniert eine Abfrage mit '' genausogut wie
> eine ohne (Index wird berücksichtigt)
> wenn das Feld als Char definiert ist, funktioniert eine numerische Eingabe
> nicht, dH der Index wird nicht berücksichtigt.
> Schlussfolgerung: die Abfragen immer mit ' formulieren ...

Flasch geschlussfolgert. Richtige Schlussfolgerung: immer so in die DB
schicken, dass es zum Datentyp des Feldes passt.

gruss, heli

Re: mysql und die verwendung von indices

am 28.12.2005 15:09:33 von Wolfgang Kueter

Am Wed, 28 Dec 2005 11:32:42 +0100 schrieb Helmut Chang:

> Werner Bauer schrieb:
>
>> Postleitzahl ist leider in der Datenbank als Varchr definiert obwohl
>> numerisch,...
>
> Wie kommst du darauf? Postleitzahlen sind zugegebenermassen in D, A, CH,
> etc. numerisch, aber nicht überall. Deshalb nimmt man im Normalfall
> nimmt man eben (VAR)CHAR.

In Deutschland gibt es führende Nullen bei den Postleitzahlen und damit
passiert bei einem numerischen Datentyp sowas:

mysql> create table foo1 (
-> ort varchar(30),
-> plz bigint);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into foo1 (ort,plz) values ('Hamburg',20354);
Query OK, 1 row affected (0.00 sec)

mysql> insert into foo1 (ort,plz) values ('Dresden',01067);
Query OK, 1 row affected (0.01 sec)

mysql> select plz, ort from foo1;
+-------+---------+
| plz | ort |
+-------+---------+
| 20354 | Hamburg |
| 1067 | Dresden |
+-------+---------+
2 rows in set (0.00 sec)

| 1000 |
+-------+
2 rows in set (0.00 sec)

.... und damit ist ein numerischer Datentyp auch für deutsche
Postleitzahlen ungeeignet.

Wolfgang