2012-04-24 2 views
6

SELECT title FROM tags WHERE title REGEXP '[\x20]' возвращает все вещи с x, 2 или 0; SELECT title FROM tags WHERE title REGEXP '\x20' возвращает все вещи буквально x20Как выполнить поиск REGEXP на основе шестнадцатеричных кодов в MYSQL?

Мой фактическое использование случая является то, что я хочу, чтобы искать какие-теги, которые могут случайно нечестным управляющие символы в.

+0

Какие контрольные символы? –

+0

На самом деле. Мне нужны только «законные» персонажи. Я предполагаю от 00 до 1F в этом верхнем графике, для начала http://www.columbia.edu/kermit/ascii.html –

ответ

3

Там может быть лучший способ сделать это, но вот что я придумал:

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

Обратите внимание, что это значения десятичных знаков, а не шестнадцатеричные. Я также не мог понять, как найти его для NULL-байтов (\x00).

Вот альтернатива, которая использует шестнадцатеричные литералы:

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

Да, это определенно взрывается на 00. Я даже не понимаю, как ваш ответ работает с x вне кавычек и используя CONCAT. Можете ли вы объяснить, что он делает для достижения этого ответа? –

+1

Если MySQL поддерживает '\ x' escapes, это создаст строку' '[\ x01- \ x1F] ''. В регулярном выражении это будет класс символов, который соответствует всем символам, где код символа находится между 1 и 1F (включительно). 'CONCAT' объединяет строки, поэтому' CONCAT ('hello', 'world') 'будет 'helloworld'. Вы можете прочитать о шестнадцатеричных литералах [здесь] (http://dev.mysql.com/doc/refman/5.0/en/charset-literal.html). –

+0

Обратите внимание, что вы можете искать один символ XML шестнадцатеричным кодом со следующим запросом: 'SELECT title FROM tags WHERE title REGEXP x'01'' – rinogo

0

Я считаю, что вы делаете это в тузде оболочке, которая удаляет обратную косые черты самих по себе. Для меня работало следующее:

select id, data regexp '\\x1F\\x8B\\x08' from ...; 
Смежные вопросы