2011-01-29 13 views
7

Piszę aplikację, która musi działać zarówno na mysql jak i postgresql. Muszę użyć like, aby porównać niektóre wartości. W przypadku mysql LIKE jest niewrażliwe na wielkość liter. W postgresql LIKE jest rozróżniana wielkość liter i ILIKE jest niewrażliwy na wielkość liter.Składnia SQL "LIKE"

Jaki jest najlepszy sposób na utworzenie solidnego zapytania, które działa na obu, w przypadku, gdy dopasowanie musi być niewrażliwe na wielkość liter?

Czy PDO ma na to rozwiązanie?

Odpowiedz

9

Najprostszym sposobem zapewnienia uwzględniania wielkości liter podobny jest użyć czegoś jak jedna z nich:

LOWER(column_name) LIKE LOWER(pattern) 
UPPER(column_name) LIKE UPPER(pattern) 

Albo można się-case/dół przypadku pattern poza SQL i po prostu użyć:

LOWER(column_name) LIKE down_cased_pattern 
UPPER(column_name) LIKE up_cased_pattern 

Używam z przyzwyczajenia LOWER, ponieważ małe litery są łatwiejsze do odczytania i łatwiejsze do debugowania.

+4

"P: Czy wszystkie skrypty mają duże i małe litery? O: Nie, w rzeczywistości większość skryptów nie ma przypadków". (Z najczęściej zadawanych pytań na temat Unicode) W ogólnym przypadku nie można liczyć na pisanie małymi literami wielkimi literami. Nie możesz również liczyć na małe litery, aby odwzorować jedną wielką literę - niektóre z nich są UPPER() na dwa znaki. Więc lower() jest bezpieczniejszy, ale tylko trochę. Czy nie kochasz życia w świecie Unicode? –

+1

@Catcall: Dobry przykład pojedynczego odwzorowania małych liter na dwie wielkie litery pochodzi z egzotycznego języka niemieckiego: 'UPPER (" ß ")' to '" SS "'. I18N i L10N to taki szczęśliwy czas zabawy! Zwłaszcza, gdy masz do czynienia z JIS, SJIS, EUC i Unicode Japanese jednocześnie nie będąc w stanie czytać po japońsku (byłeś tam, robiłeś to, ciesząc się, że UTF-8 jest obecnie dość standardowym standardem). –

3

To jest zadanie użytkownika Database Abstraction Layer.

PDO does not zrób to, czego szukasz, ale istnieje kilka DAL PHP, jeśli jesteś google for them.

CHNP nie udostępnia bazy danych abstrakcji; nie przepisuje kodu SQL ani nie odtwarza brakujących funkcji. Powinieneś użyć użyć pełnej warstwy abstrakcji, jeśli potrzebujesz tego obiektu.