sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo escapar de la cadena al hacer coincidir el patrón en PostgreSQL

Los caracteres _ y % deben estar entrecomillados para que coincidan literalmente en una declaración LIKE, no hay forma de evitarlo. La elección es hacerlo del lado del cliente o del lado del servidor (normalmente mediante el uso de SQL replace(), consulte a continuación). Además, para hacerlo 100 % correcto en el caso general, hay algunas cosas a considerar.

De forma predeterminada, el carácter de comillas que se usa antes de _ o % es la barra invertida (\), pero se puede cambiar con una cláusula ESCAPE inmediatamente después de la cláusula LIKE. En cualquier caso, el carácter de comillas debe repetirse dos veces en el patrón para coincidir literalmente como un carácter.

Ejemplo:... WHERE field like 'john^%node1^^[email protected]%' ESCAPE '^' coincidiría con john%node1^[email protected] seguido de cualquier cosa.

Hay un problema con la opción predeterminada de barra invertida:ya se usa para otros fines cuando las cadenas de conformidad estándar están desactivadas (PG 9.1 lo tiene activado de forma predeterminada, pero las versiones anteriores aún se usan ampliamente, este es un punto a considerar).

Además, si la comilla para el comodín LIKE se realiza del lado del cliente en un escenario de inyección de entrada del usuario, viene además de a las comillas de cadena normales ya necesarias en la entrada del usuario.

Un vistazo a un ejemplo de go-pgsql indica que usa marcadores de posición de estilo $N para las variables... Así que aquí hay un intento de escribirlo de una manera genérica:funciona con cadenas de conformidad estándar tanto activadas como desactivadas, utiliza el reemplazo del lado del servidor de [%_], un carácter de comillas alternativo, citando el carácter de comillas y evita la inyección de sql:

   db.Query("SELECT * from USERS where name like replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') ||'%' ESCAPE '^'",
     variable_user_input);