2012-04-24 9 views
6

SELECT title FROM tags WHERE title REGEXP '[\x20]' devuelve todas las cosas con x, 2 o 0; SELECT title FROM tags WHERE title REGEXP '\x20' devuelve todas las cosas con literalmente x20¿Cómo hago la búsqueda REGEXP basada en códigos hexadecimales en MYSQL?

Mi caso de uso real es que quiero buscar las etiquetas que puedan haber ingresado accidentalmente caracteres de control en.

+0

¿Qué caracteres de control? –

+0

Cualquiera realmente. Solo quiero personajes "legítimos" allí. Supongo que de 00 a 1F en ese gráfico superior, para empezar http://www.columbia.edu/kermit/ascii.html –

Respuesta

3

Puede haber una mejor manera de hacer esto, pero esto es lo que se me ocurrió:

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

Tenga en cuenta que estos son valores de caracteres decimales, no hexadecimales. Tampoco pude encontrar la forma de que encuentre bytes NULL (\x00) también.

Aquí es una alternativa que utiliza literales hexagonales:

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

Sí, definitivamente explota en 00. Ni siquiera entiendo cómo funciona tu respuesta con una x fuera de las comillas y usando CONCAT. ¿Puedes explicar qué está haciendo para lograr esa respuesta? –

+1

Si MySQL admite '\ x' se escapa esto construiría la cadena' '[\ x01- \ x1F]' '. En la expresión regular, se trataría de una clase de caracteres que coincida con todos los caracteres cuyo código de carácter esté entre 1 y 1F (inclusive). 'CONCAT' concatena cadenas, por lo que' CONCAT ('hello', 'world') 'sería 'helloworld'. Puede leer sobre los literales hexadecimales [aquí] (http://dev.mysql.com/doc/refman/5.0/en/charset-literal.html). –

+0

Tenga en cuenta que puede buscar un único carácter XML por código hexadecimal con la siguiente consulta: 'SELECCIONAR título DE etiquetas WHERE título REGEXP x'01'' – rinogo

0

Creo que lo haces con cáscara de MySQL que elimina las barras invertidas por su propia cuenta. Lo siguiente funcionó para mí:

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