MYSQL: select WHERE LIKE med siffror

Tråden skapades och har fått 4 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Boden
  • 2012-11-26 13:39

Hej.

Jag vill hämta alla inlägg som innehåller 01. Detta borde funka, men gör av någon anledning inte det:

$query = "SELECT * FROM employees WHERE treatments LIKE '%01%'";

Det funkar om jag söker efter LIKE '%test%', men inte med 01. Hur gör jag för att använda siffror i LIKE?

  • Medlem
  • Boden
  • 2012-11-26 14:27

Kan tillägga lite information

treatments är VARCHAR och kan exempelvis se ut såhär: 01,02,03

Om jag ändrar ett inlägg till 01,02,03,test så hittas det om man söker efter LIKE '%test%'. Det är alltså siffror som inte går att söka efter.

Jag hittade Denna tråd som behandlar liknande problem, men lösningen funkar inte i mitt fall. Antagligen eftersom mitt problem inte är att treatments är en integer i mysql.

Jag har även testat att ändra till b01,b02,b03 och LIKE '%b01%' så att det inte bara är siffror som behandlas, men det funkar inte.

Ett snabbt test i Oracle, DB2, MSSQL, Postgresql och Access säger att det funkar alldeles utmärkt att skriva så.

create table TESTVC (testup VARCHAR(20));

select testup from testvc;
  testup
----------
 01,01,01
 01,02,03
 01,02,01
 04,04,04

select testup from testvc where testup like '%01%';
  testup
----------
 01,01,01
 01,02,03
 01,02,01

select testup from testvc where testup like '%04%';
  testup
----------
 04,04,04

Med andra ord är det rätt sannolikt att det funkar bra i mysql också. Det måste vara något annat som spökar.

  • Medlem
  • Kiruna
  • 2012-11-26 20:55

Det ska fungera även i MySQL. Har du kört frågan direkt i något klientprogram (istf. via programkoden (som verkar vara PHP)), för att se vad som händer då? Visa även gärna din tabelldefinition.

Sen kan tilläggas att en LIKE-fråga med wildcard i början av söksträngen aldrig är snabb, eftersom den inte kan utnyttja något index, samt att om de nummer du lagrar i 'treatments'-fältet refererar till andra poster (i andra tabeller), så bör man inte lagra dem som en textsträng, utan normalisera dem till en egen tabell.

  • Medlem
  • Stockholm
  • 2012-11-27 11:37

Kan det språk du arbetar med (PHP?) använda %01 som någon sorts escape-sekvens för något? Kolla syntaxen...

Vill också stryka under det som spot nämnde om normalisering... Lagringen du beskriver är mycket ineffektiv. Om din datamängd växer kommer prestandan att bli katastrofal. Hade tabell-strukturen varit normaliserad hade du inte behövt använda LIKE.

1
Bevaka tråden