Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:consultando entidades unicode


Bem, isso é apenas um escape duplo, mas sim, funciona e aqui está o porquê:no MySQL, há uma segunda camada de escape envolvida quando você usa o LIKE operador.
services LIKE '%L\\\\u00e4mm\\\\u00f6n%'

a análise desse literal de string do MySQL fornece uma comparação com a consulta LIKE %L\\u00e4mm\\u00f6n% . Como o MySQL trata \ em uma consulta LIKE como um escape, que corresponderá à string literal que contém L\u00e4mm\u00f6n .

A razão para isso é que você pode combinar strings com uma expressão de consulta que contém um literal % ou _ personagem. Por exemplo, se eu quiser pesquisar uma coluna pela string literal 100% , posso comparar com 100\% (escrito em uma consulta como '100\\%' ) e certifique-se de que estou realmente obtendo cem por cento e não qualquer string começando com cem.

É lamentável que o MySQL use barra invertida tanto para o escape de consulta LIKE quanto para o escape literal de string, especialmente porque você provavelmente está escrevendo em uma linguagem de programação envolvente que também os usa, terminando com uma codificação tripla real, que se parece com "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'" - argh!

É duplamente lamentável, pois esse comportamento não é compatível com ANSI SQL e não funcionará em nenhum outro banco de dados. ANSI SQL diz que não há caractere de escape em consultas LIKE por padrão, portanto, se você quiser corresponder a um literal % ou _ você deve optar por nomear um caractere de escape próprio, por exemplo:
something LIKE '100=%' ESCAPE '='

Para compatibilidade entre bancos de dados, é melhor sempre usar o LIKE ...ESCAPE form e escolha algo diferente da barra invertida horrível! (Além disso - as barras invertidas do MySQL para escape literal de string SQL também não são compatíveis com ANSI! Mas você pode desativar esse mau comportamento com a configuração NO_BACKSLASH_ESCAPES sql_mode.)

Provavelmente uma ideia melhor seria quebrar services em uma segunda tabela em vez de esmagá-los em uma única coluna de string - ou seja. coloque seu esquema na Primeira Forma Normal. Então você pode obter uma pesquisa simples de valores individuais em vez de ter que fazer uma correspondência de substring de varredura completa de tabela lenta.