PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como escapar de string ao combinar o padrão no PostgreSQL


Os caracteres _ e % precisam ser citados para serem correspondidos literalmente em uma instrução LIKE, não há como contornar isso. A escolha é fazer isso do lado do cliente ou do lado do servidor (normalmente usando o SQL replace(), veja abaixo). Além disso, para acertar 100% no caso geral, há algumas coisas a serem consideradas.

Por padrão, o caractere de aspas a ser usado antes de _ ou % é a barra invertida (\), mas pode ser alterado com uma cláusula ESCAPE imediatamente após a cláusula LIKE. Em qualquer caso, o caractere de aspas deve ser repetido duas vezes no padrão para ser correspondido literalmente como um caractere.

Exemplo:... WHERE field like 'john^%node1^^[email protected]%' ESCAPE '^' corresponderia a john%node1^[email protected] seguido de nada.

Há um problema com a escolha padrão de barra invertida:ela já é usada para outros propósitos quando standard_conforming_strings está DESLIGADO (o PG 9.1 o tem LIGADO por padrão, mas as versões anteriores ainda estão em uso amplo, este é um ponto a considerar).

Além disso, se a citação do curinga LIKE for feita no lado do cliente em um cenário de injeção de entrada do usuário, ela virá além de para a citação de string normal já necessária na entrada do usuário.

Uma olhada em um exemplo go-pgsql diz que ele usa espaços reservados no estilo $N para variáveis... [%_], um caractere de aspas alternativo, citando o caractere de aspas, e evita a injeção de sql:
   db.Query("SELECT * from USERS where name like replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') ||'%' ESCAPE '^'",
     variable_user_input);