2009-10-12 17 views
16

Tengo la construcción de consultas MYSQL con backticks. Por ejemplo,Usando backquote/backticks para consultas de mysql

SELECT `title` FROM `table` WHERE (`id` = 3) 

en oposición a:

SELECT title FROM table WHERE (id = 3) 

Creo que tengo esta práctica de los phpMyAdmin exportaciones, y por lo que he entendido, incluso rieles genera sus consultas como esta.

Pero hoy en día veo cada vez menos consultas construidas de esta manera, y también, el código parece más complicado y más complicado con backticks en las consultas. Incluso con las funciones auxiliares de SQL, las cosas serían más simples sin ellas. Por lo tanto, estoy considerando dejarlos atrás.

Quería saber si hay alguna implicación en esta práctica, como la velocidad de interpretación SQL (MySQL en mi caso), etc. ¿Qué opina?

Respuesta

16

Los palos de retroceso también permiten espacios y otros caracteres especiales (a excepción de los palos de atrás, obviamente) en los nombres de tabla/columna. No son estrictamente necesarios, pero una buena idea para la seguridad.

Si sigue las reglas razonables para nombrar tablas y columnas, los backticks no deberían ser necesarios.

+0

es 'date' no un nombre de columna sensata? –

+0

'date' es uno de esos que parece sensato, pero es una palabra reservada de MySQL. Las palabras reservadas de MySQL se enumeran aquí: https://dev.mysql.com/doc/refman/5.5/en/keywords.html – Tenner

+0

@Tenner, ¿cómo escapar de un retroceso? –

2

Bueno, si se asegura de que nunca use accidentalmente una palabra clave como identificador, no necesita los backticks. :-)

+1

O cualquier espacio y tal ... –

1

Mi creencia era que los backticks se usaban principalmente para evitar consultas erróneas que utilizaban identificadores de SQL comunes, es decir, LIMIT y COUNT.

3

Los marcadores se usan para escapar palabras clave reservadas en su consulta de mysql, p. desea tener una columna count, no es poco común.

puede utilizar otros caracteres especiales o espacios en sus columnas/mesa/nombres db

que no te mantienen a salvo de los ataques de inyección (si se permite a los usuarios introducir nombres de columna en un poco de práctica camino malo de todos modos)

no están estandarizados sql y solo funcionarán en mysql; otros dbms utilizarán " en su lugar

15

Cada vez que veo esto discutido, trato de presionar para su inclusión, porque, bueno, la respuesta ya está escondida aquí, aunque se borró con ironía sin pensarlo más. Cuando utilizamos erróneamente una palabra clave como campo o nombre de tabla, podemos evitar confusiones por diversos métodos, pero solo la respuesta a conciencia "permite un beneficio aún mayor".

Cada palabra en un enunciado sql se ejecuta a través de toda la tabla de palabras clave hash para ver si hay conflictos, por lo tanto, ha hecho una gran consulta al decirle al compilador que, oye, sé lo que estoy haciendo, no necesita verificar estas palabras porque representan nombres de tablas y campos. Velocidad y elegancia

Saludos, Brad

+4

Acelerar el analizador SQL es una razón completamente engañosa. La aceleración que espera que el analizador de SQL obtenga es completamente imaginaria. Si crees que hay una aceleración, mídela y cuantifica. De lo contrario, es una optimización innecesaria y, por lo tanto, prematura. –

1

leer la documentación sobre los identificadores en http://dev.mysql.com/doc/refman/5.6/en/identifiers.html

generadores SQL a menudo incluye los acentos abiertos, ya que es más sencillo que incluye una lista de todas las palabras reservadas de MySQL.Para utilizar cualquier secuencia de caracteres BMP Unicode excepto U + 0000 como un identificador, que puede simplemente

  1. Reemplazar todos los acentos abiertos con acentos abiertos dobles
  2. Surround que con acentos abiertos individuales

Cuando escribo consultas hechas a mano, conozco (la mayoría de) las palabras reservadas de MySQL, y prefiero no usar las notas reversa cuando sea posible ya que es más corto y la OMI más fácil de leer.

La mayoría de las veces, es solo una preferencia de estilo, a menos que, por supuesto, tenga un campo como date o , y luego debe usar los puntos de apoyo.

1. Aunque ver https://bugs.mysql.com/bug.php?id=68676