Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z niektorymi znakami przy uzyciu REGEXP BINARY
Forum PHP.pl > Forum > Bazy danych > MySQL
misty
czesc,
uzywam REGEXP BINARY do szukania jak LIKE ale z uwzglednieniem wielkosci znakow. Wszystko jest ok, dopoki nie uzyje niektorych znakow, takich jak np + czy ?

zapytanie wyglada mniej wiecej tak:

  1. SELECT * FROM users WHERE DESC REGEXP BINARY '+test'


i na takim sie krzaczy a ja dostaje:
Got error 'repetition-operator operand invalid' from regexp

jesli bym dala bez + to byloby ok.
Czy ktos z Was wie moze jak mozna to naprawic?

pzdr,
misty
Crozin
1. Wyrażenia regularne mają pewne znaki specjalnie. Jeżeli chcesz by były traktowane jako zwykłe znaki poprzedź je znakiem ucieczki: \+
2. Dlaczego nie skorzystasz z LIKE-a z uwzględnieniem wielkości znaków? LIKE sam w sobie to beznadziejny mechanizm wyszukiwania, ale wyrażenia regularne to już kompletne nieporozumienie.
misty
hej,
ale istnieje LIKE ktory porownuje wielkosc znakow? szukalam ale nie znalazlam takiego-stad wyrazenia regularne.
Crozin
Sposób porównywania znaków jest określany przez atrybut COLLATION kolumny. Ewentualnie jeżeli chcesz w tym konkretnym przypadku zastosować inne porównywanie znaków, niż domyślne dla kolumny, użyj następującej składni:
  1. ... WHERE col_name LIKE 'val' COLLATE 'utf8_unicode_cs' ...
misty
no, a jesli nie znam COLLATE?
Crozin
http://dev.mysql.com/doc/refman/5.5/en/charset.html
9.1.1, 9.1.2
misty
widzisz, ale ja nie mam uprawnien do ustawiania czegokolwiek na bazie. ja juz szukalam wyjscia z like no i w moim wypadku nie da sie. a wyrazenia regularne.. sa ok, tylko trzeba wiedziec jak ich uzyc.. i na pewno na moj problem tez jest sposob..
Crozin
Przecież fragment kodu jaki podałem to zwykłe zapytanie (SELECT) do bazy, które nic nie modyfikuje.
misty
no tak, ale ja pisalam ze nie znam COLLATE, wiec nie moge wykonac tego:

  1. WHERE col_name LIKE 'val' COLLATE 'utf8_unicode_cs' ...


nie mam rowniez uprawnien takich aby wykonac:

  1. SET NAMES 'utf8';


wracajac do Twojej wczesniejsze wypowiedzi, zeby poprzedzac znakiem ucieczki, to dziala (czesciowo przynajmniej) z podwojnym znakiem \\, ale niestety sypie sie jak dam np ?"\[i'
dostaje ze

mysql error: Got error 'brackets ([ ]) not balanced' from regexp

sad.gif



pzdr,
misty

jakby ktos mial kiedys taki problem jak ja-wyglada na to ze jednym rozwiazaniem jest stawianie \\ przed kazdym takim specjalnym znakiem.

pzdr
Crozin
1. Przecież podałem Ci linka gdzie masz opisane systemy porównywania znaków (collations). Wybierz te , które odpowiada Twojemu kodowaniu (utf8_*, latin2_*) i oczekiwanym porownywaniem znaków (*_cs, *_ci).
2. Do SET NAMES nie potrzebujesz żadnych uprawnień. To charakteryzuje jedynie kodowanie / porównywanie znaków dla połączenia na linii klient - serwer.
3. Znak ucieczki to "\", nie "\\". "\\" to znak ucieczki przed znakiem ucieczki, czyli literał "\".
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.