Programmering

Fortsetter jakten på MySQL-features

5. november 2009 · Ingen Kommentarer

I dag kom jeg over noe merkelige greier i MySQL.

I en SELECT-spørring hvor jeg bruker WHERE for å søke etter strenger, så betyr det ingenting om jeg spør mot en tom streng eller masse mellomrom.

Jeg har en tabell som heter “texts” med kolonnene “uuid”, “name” og “content”. Feltet “content” er av type TEXT fordi jeg har behov for å lagre et ukjent antall tegn med tekst her.


+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| uuid         | varchar(36)  | NO   | PRI |         |       |
| name         | varchar(16)  | NO   |     |         |       |
| content      | text         | NO   |     |         |       |
+--------------+--------------+------+-----+---------+-------+

Først testet jeg med en tom streng:


mysql> SELECT uuid,name,content FROM texts \
    -> WHERE content = "";
+--------------------------------------+-------------+---------+
| uuid                                 | name        | content |
+--------------------------------------+-------------+---------+
| 1b74168e-5b91-4c27-b1eb-257d6d0cee18 | description |         |
| 963c7f0a-e0dc-45e5-af5b-a803dee3a743 | arrival     |         |
| a7bf022e-fc95-4410-bd6e-e92b64f12db4 | regulation  |         |
| ebffc5bb-b3f8-473d-8f34-a5041f73987c | sanitation  |         |
+--------------------------------------+-------------+---------+
4 rows in set (0.00 sec)

Deretter forsøkte jeg bare for moro skyld å søke etter tre mellomrom:


mysql> SELECT uuid,name,content FROM texts \
    -> WHERE content = "   ";
+--------------------------------------+-------------+---------+
| uuid                                 | name        | content |
+--------------------------------------+-------------+---------+
| 1b74168e-5b91-4c27-b1eb-257d6d0cee18 | description |         |
| 963c7f0a-e0dc-45e5-af5b-a803dee3a743 | arrival     |         |
| a7bf022e-fc95-4410-bd6e-e92b64f12db4 | regulation  |         |
| ebffc5bb-b3f8-473d-8f34-a5041f73987c | sanitation  |         |
+--------------------------------------+-------------+---------+
4 rows in set (0.00 sec)

Men for all del da? Dette er jo samme resultatet som ovenfor.

Eller hva med denne spørringen? Jeg kan ikke skjønne hvorfor det er slik. En tom streng er ikke det samme som tre spacer!


mysql> SELECT uuid,name,content FROM texts \
    -> WHERE content = "   " AND content = "";
+--------------------------------------+-------------+---------+
| uuid                                 | name        | content |
+--------------------------------------+-------------+---------+
| 1b74168e-5b91-4c27-b1eb-257d6d0cee18 | description |         |
| 963c7f0a-e0dc-45e5-af5b-a803dee3a743 | arrival     |         |
| a7bf022e-fc95-4410-bd6e-e92b64f12db4 | regulation  |         |
| ebffc5bb-b3f8-473d-8f34-a5041f73987c | sanitation  |         |
+--------------------------------------+-------------+---------+
4 rows in set (0.00 sec)

Hvorfor i alle dager gjør MySQL dette her mot meg?

Én teori jeg har er at MySQL skal hjelpe meg som en dum utvikler i å returnere det korrekte svaret selv om jeg skulle skrevet inn et mellomrom for mye i søkefeltet mitt. Akkurat i samme stil som de andre gangene MySQL har vært så hjelpsom mot meg