2012-04-24 12 views
6

SELECT title FROM tags WHERE title REGEXP '[\x20]' zwraca wszystkie rzeczy zx, 2 lub 0; SELECT title FROM tags WHERE title REGEXP '\x20' powraca wszystkie rzeczy dosłownie x20Jak wyszukiwać REGEXP w oparciu o kody szesnastkowe w MYSQL?

Mój rzeczywisty przypadków użycia jest, że chcę, aby szukać żadnych znaczników, które mogą przypadkowo otrzymali dostęp znaków sterujących w.

+0

Które znaki kontrolne? –

+0

Dość naprawdę. Chcę tylko "legalnych" postaci. Zgaduję, że od 00 do 1F w tym top wykresie, na początek http://www.columbia.edu/kermit/ascii.html –

Odpowiedz

3

Nie może być lepszy sposób to zrobić, ale Oto, co wymyśliłem:

SELECT title FROM tags WHERE title REGEXP CONCAT('[',CHAR(1),'-',CHAR(31),']') 

Należy pamiętać, że są to wartości dziesiętne, a nie szesnastkowe. Nie mogłem również znaleźć sposobu na znalezienie NULL bytes (\x00).

Oto alternatywa, która wykorzystuje literały sześciokątne:

SELECT title FROM tags WHERE title REGEXP CONCAT('[', x'01', '-', x'1F', ']') 
+0

Tak, zdecydowanie wybucha na 00. Nie rozumiem nawet, jak twoja odpowiedź działa z x poza wycenami i używanie CONCAT. Czy możesz wyjaśnić, co robi ta odpowiedź? –

+1

Jeśli MySQL obsługiwał '\ x', to tworzyło ciąg' '[\ x01- \ x1F]' '. W wyrażeniu regularnym jest to klasa znaków pasująca do wszystkich znaków, w których kod znaku wynosi od 1 do 1F (włącznie). 'CONCAT' łączy łańcuchy, więc' CONCAT ('hello', 'world') "będzie" światem żywym ". Możesz przeczytać o literałach szesnastkowych [tutaj] (http://dev.mysql.com/doc/refman/5.0/en/charset-literal.html). –

+0

Należy pamiętać, że można wyszukać pojedynczy znak XML za pomocą kodu heksadecymalnego z następującym zapytaniem: 'WYBIERZ tytuł z tagów WHERE tytuł REGEXP x'01'' – rinogo

0

wierzę to zrobić w skorupkach mysql który usuwa backslashy na własną rękę. Dla mnie:

select id, data regexp '\\x1F\\x8B\\x08' from ...;