sql >> Base de Datos >  >> RDS >> Mysql

MySQL:consulta de entidades Unicode

Bueno, eso es solo doble escape, pero sí funciona y he aquí por qué:en MySQL, hay una segunda capa de escape involucrada cuando usa el LIKE operador.

services LIKE '%L\\\\u00e4mm\\\\u00f6n%'

analizar ese literal de cadena de MySQL le brinda una comparación con la consulta LIKE %L\\u00e4mm\\u00f6n% . Porque MySQL trata \ en una consulta LIKE como escape, que en realidad coincidirá con la cadena literal que contiene L\u00e4mm\u00f6n .

El motivo de esto es que puede hacer coincidir cadenas con una expresión de consulta que contiene un literal % o _ personaje. Por ejemplo, si quiero buscar en una columna la cadena literal 100% , puedo compararlo con 100\% (escrito en una consulta como '100\\%' ) y asegurarme de que realmente estoy obteniendo el cien por ciento y no cualquier cadena que comience con cien.

Es desafortunado que MySQL use una barra invertida tanto para su escape de consulta LIKE como para su escape literal de cadena, especialmente dado que probablemente esté escribiendo en un lenguaje de programación adjunto que también los usa, terminando con una codificación triple real, que se parece a "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'" - ¡argh!

Es doblemente desafortunado dado que este comportamiento no es compatible con ANSI SQL y no funcionará en ninguna otra base de datos. ANSI SQL dice que no hay un carácter de escape en las consultas LIKE de forma predeterminada, por lo que si desea hacer coincidir un literal % o _ debe optar por nominar un personaje de escape propio, por ejemplo:

something LIKE '100=%' ESCAPE '='

Para la compatibilidad entre bases de datos, es mejor usar siempre LIKE ...ESCAPE form, y elija algo que no sea la horrible barra invertida! (Aparte, ¡las barras diagonales inversas de MySQL para el escape literal de cadenas SQL tampoco cumplen con ANSI! Pero puede desactivar ese mal comportamiento con la configuración NO_BACKSLASH_ESCAPES sql_mode).

Probablemente una mejor idea sería romper services en una segunda tabla en lugar de aplastarlos en una sola columna de cadena, es decir. pon tu esquema en Primera Forma Normal. Entonces podría obtener una búsqueda simple de valores individuales en lugar de tener que hacer una coincidencia de subcadena de escaneo de tabla completa lenta.