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

Escapar de los comodines de MySQL

_ y % no son comodines en MySQL en general, y no deben escaparse con el fin de ponerlos en cadenas literales normales. mysql_real_escape_string es correcto y suficiente para este propósito. addcslashes no debe usarse.

_ y % son especiales únicamente en el contexto de LIKE -pareo. Cuando desee preparar cadenas para uso literal en un LIKE declaración, de modo que 100% coincide al cien por cien y no solo a cualquier cadena que comience con cien, tiene dos niveles de escape de los que preocuparse.

El primero es como escapar. El manejo de LIKE se lleva a cabo completamente dentro de SQL, y si desea convertir una cadena literal en una expresión LIKE literal, debe realizar este paso incluso si está utilizando consultas parametrizadas !

En este esquema, _ y % son especiales y deben escaparse. El carácter de escape también se debe escapar. De acuerdo con ANSI SQL, los caracteres que no sean estos no deben ser escapado:\' estaría mal (Aunque MySQL normalmente te permitirá salirte con la tuya).

Una vez hecho esto, pasa al segundo nivel de escape, que es un simple escape literal de cadena. Esto tiene lugar fuera de SQL, creando SQL, por lo que debe hacerse después del paso de escape LIKE. Para MySQL, esto es mysql_real_escape_string como antes; para otras bases de datos habrá una función diferente, solo puede usar consultas parametrizadas para evitar tener que hacerlo.

El problema que genera confusión aquí es que en MySQL se usa una barra invertida como carácter de escape para ambos pasos de escape anidados. Entonces, si quisiera hacer coincidir una cadena con un signo de porcentaje literal, tendría que hacer doble barra invertida y escapar y decir LIKE 'something\\%' . O, si eso está en un PHP " literal que también usa escape de barra invertida, "LIKE 'something\\\\%'" . ¡Argh!

Esto es incorrecto de acuerdo con ANSI SQL, que dice que:en los literales de cadena, las barras invertidas significan barras invertidas literales y la forma de escapar de una comilla simple es ''; en las expresiones LIKE no hay ningún carácter de escape por defecto.

Entonces, si desea LIKE-escape de forma portátil, debe anular el comportamiento predeterminado (incorrecto) y especificar su propio carácter de escape, usando LIKE ... ESCAPE ... construir. ¡Por cordura, elegiremos algo que no sea la maldita barra invertida!

function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}

$escapedname= mysql_real_escape_string(like($name, '='));
$query= "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";

o con parámetros (p. ej. en PDO):

$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ...");
$q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);

(Si desea más tiempo de fiesta de portabilidad, también puede divertirse tratando de dar cuenta de MS SQL Server y Sybase, donde el [ el carácter también es, incorrectamente, especial en un LIKE declaración y tiene que ser escapado. argumento)