Usar retrocesos alrededor de los nombres de campo

172

Después de leer un par de respuestas y comentarios sobre algunas preguntas de SQL aquí, y también de escuchar que un amigo mío trabaja en un lugar que tiene una política que las prohíbe, me pregunto si hay algo malo en usar backticks alrededor de los nombres de campo en MySQL .

Es decir:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
nickf
fuente
24
acentos abiertos son realmente útil si usted quiere tener nombres de columna como count, type, tableo similares
knittl
1
ver también stackoverflow.com/questions/23446377/…
Ian Ringrose
@knittl creo que la pregunta es, ¿ debería usted tiene nombres de columna como count, type, y table. Esos son términos terriblemente ambiguos y en casi todos los casos esos nombres podrían mejorarse para ser más específicos. Nombrar las columnas de ese tipo también es peligroso y una fuente potencial de errores, ya que nunca se sabe cuándo alguien podría olvidar agregar los backticks o no darse cuenta de que tienen que hacerlo. Creo que es mejor evitar usar términos reservados como nombres de columna.
dallin
Los uso siempre y, por lo tanto, no corro peligro de haber usado palabras clave reservadas en ningún momento.
Markus Zeller

Respuestas:

153

El uso de backticks le permite usar caracteres alternativos. En la redacción de consultas no es un problema, pero si se supone que puede usar backticks, supongo que le permite salirse con la suya con cosas ridículas como

SELECT `id`, `my name`, `another field` , `field,with,comma` 

Lo que, por supuesto, genera tablas mal nombradas.

Si solo está siendo conciso, no veo un problema, notará si ejecuta su consulta como tal

EXPLAIN EXTENDED Select foo,bar,baz 

La advertencia generada que vuelve tendrá tics de retroceso y nombres de tabla totalmente calificados. Por lo tanto, si está utilizando funciones de generación de consultas y una reescritura automática de consultas, los backticks harán que cualquier cosa que analice su código sea menos confusa.

Sin embargo, creo que, en lugar de exigir si puedes usar backticks, deberían tener un estándar para los nombres. Soluciona más problemas 'reales'.

Kent Fredric
fuente
¿Necesitamos usarlos también en PostgreSQL?
Yousuf Memon
55
No hay necesidad, solo recomendación. Es útil representarlos entre comillas para evitar la ambigüedad con las palabras clave SQL si, en el futuro, se agrega una palabra clave SQL que comparte el nombre de sus campos. La única vez que usted / necesidad / a cotización es cuando un campo hace compartir un nombre de palabra clave, por ejemplo, select count from foovs select "count" from foodará resultados muy diferentes. Pero postgres difiere de mysql en 2 formas: 1. Los campos se citan por "". 2. Los campos sin comillas no distinguen entre mayúsculas y minúsculas postgresql.org/docs/current/static/…
Kent Fredric
57

El único problema con los backticks es que no son compatibles con ANSI-SQL, por ejemplo, no funcionan en SQL Server.

Si existe la posibilidad de que tenga que portar su SQL a otra base de datos, utilice comillas dobles.

Alexander Kojevnikov
fuente
15
Sí. Utilice el modo ANSI de MySQL - dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - para habilitar comillas dobles en MySQL y así recuperar la compatibilidad entre bases de datos. Los backticks / quotes también son necesarios porque nunca se sabe qué se convertirá en una palabra reservada en futuras versiones de DBMS.
bobince
1
¡Eso es muy cierto! Una de nuestras aplicaciones de servidor funcionaba bien hasta que aplicamos una actualización a nuestro motor de base de datos, que agregó una nueva palabra clave. De repente, todo lo que consultaba una mesa en particular se rompió.
Miquella
@bobince Cuando era nuevo en desarrollo, nombré una columna rangeo algo así. ¡Cuando actualizamos a MySQL 5 falló porque era una nueva palabra reservada!
alex
1
No use comillas dobles. No siempre funcionará. Por ejemplo ... DELETE FROM app_key_storesWHERE ("key" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Consulta OK, 0 filas afectadas (0.00 seg) BORRAR DE app_key_storesDONDE ( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Consulta OK, 5 filas afectadas (0.00 seg)
Altonymous
44

Para mí tiene mucho sentido usarlos en todo momento cuando se trata de nombres de campo.

  • En primer lugar, una vez que adquieras el hábito, no está de más presionar la tecla de retroceso.
  • En segundo lugar, para mí, es más fácil ver cuáles son exactamente los campos en su consulta y cuáles son las palabras clave o los métodos.
  • Por último, le permite usar cualquier nombre de campo que desee al diseñar su tabla. A veces tiene mucho sentido nombrar un campo "clave", "orden" o "valores" ... todo lo cual requiere retroceder cuando se hace referencia a ellos.
nickf
fuente
19
También debe agregar que lo protege de futuras palabras reservadas que se utilicen (lo que me ha mordido antes).
alex
55
Realmente hice que alguien editara los backticks adicionales de una de mis preguntas una vez, lo que me molestó, ya que esta razón es la razón exacta por la que rodeo cada variable con ellos
Brian Leishman
2
También permite el uso seguro de etiquetas que no están en inglés, lo que solo es suficiente para fomentar el uso de backticks.
Aternus
26

Los backticks no son parte del ANSI SQL estándar. Del manual de mysql :

Si el modo ANSI_QUOTES SQL está habilitado, también se permite citar identificadores dentro de comillas dobles

Entonces, si usa backticks y luego decide alejarse de MySQL, tiene un problema (aunque probablemente también tenga problemas mucho más grandes)

Greg
fuente
9

No hay nada de malo si sigues usando MYSQL, excepto tal vez la confusión visual de las consultas. Pero sí permiten el uso de palabras clave reservadas o espacios incrustados como nombres de tabla y columna. Este es un no-no con la mayoría de los motores de bases de datos y evitará cualquier migración en un momento posterior.

En cuanto a la lectura fácil, muchas personas usan mayúsculas para las palabras clave SQL, por ejemplo.

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
Christian Lescuyer
fuente
6

Si me preguntas, los backticks siempre deben usarse. Pero hay algunas razones por las que un equipo puede preferir no usarlas.

Ventajas:

  • Al usarlos, no hay palabras reservadas o caracteres prohibidos.
  • En algunos casos, obtienes mensajes de error más descriptivos.
  • Si evita las malas prácticas, no le importa, pero ... en palabras reales, a veces son una forma decente de evitar las inyecciones de SQL.

Desventajas

  • No son estándar y generalmente no son portátiles. Sin embargo, siempre y cuando no utilice un backtick como parte de un identificador (que es la peor práctica que puedo imaginar), puede transferir su consulta eliminando automáticamente los backticks.
  • Si parte de su consulta proviene de Access, pueden citar los nombres de las tablas con "(y tal vez no pueda eliminar todo" a ciegas). Sin embargo, se permiten mezclas de backticks y comillas dobles.
  • Algún estúpido software o función filtra sus consultas y tiene problemas con los backticks. Sin embargo, son parte de ASCII, por lo que esto significa que su software / función es muy malo.
Federico
fuente
9
El uso de backticks no tiene absolutamente nada que ver con evitar las inyecciones SQL.
Andy Lester
66
@andy podría ayudar, ya que un atacante tiene que cerrarlo con otro backtick para inyectar. Hace poco, pero eso sigue siendo algo
jasonszhao
4

Es mucho más fácil buscar en su base de código algo en backticks. Digamos que tienes una tabla llamada event. grep -r "event" *podría devolver cientos de resultados. grep -r "\`event\`" *devolverá cualquier cosa que probablemente haga referencia a su base de datos.

EllisGL
fuente
En general no es realmente un beneficio. Las tablas que se encuentran profesionalmente se denominan más como new_users_info que "general".
ankush981
3

Bueno, hasta donde yo sé, el propósito de usar backticks es para que puedas usar nombres que coincidan con palabras clave reservadas. Entonces, si el nombre no está chocando con una palabra clave reservada, no veo ninguna razón para usar backticks. Pero, esa tampoco es razón para prohibirlos.

Chris Jester-Young
fuente
2

Cosa simple sobre la tecla de retroceso `` es usar para denotar identificador como nombre_base_datos, nombre_tabla, etc., y comilla simple '' , comilla doble "" para literales de cadena, mientras que "" se usa para imprimir el valor tal como está y '' imprimir la variable de valor retener o en otro caso imprime el texto que tiene.

i.e 1.-> use `model`;   
    here `model` is database name not conflict with reserve keyword 'model'
2- $age = 27;
insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi");

here i used both quote for all type of requirement. If anything not clear let me know..
Sonpal Singh Sengar
fuente
0

si está utilizando algunos nombres de campo como valores predeterminados de mysql o mssql, por ejemplo, "estado", debe usar las marcas de retroceso ("select statusfrom table_name" o "select id from table_name where status= 1"). porque mysql devuelve errores o no funciona la consulta.

ysrtymz
fuente
0

El uso principal de backticks (`) en SQL es usarlos en situaciones en las que va a volver a llamarlos en próximas cláusulas. En cualquier otro momento, se recomienda utilizar comillas dobles ("").

Por ejemplo

SELECT CONCAT(Name, ' in ', city, ', ', statecode) AS `Publisher and Location`,
    COUNT(ISBN) AS "# Books",
    MAX(LENGTH(title)) AS "Longest Title",
    MIN(LENGTH(title)) AS "Shortest Title"
FROM Publisher JOIN Book
ON Publisher.PublisherID = Book.PublisherID WHERE INSTR(name, 'read')>0
GROUP BY `Publisher and Location`
HAVING COUNT(ISBN) > 1;

En la declaración anterior, ¿cómo Publisher and Locationse usa nuevamente en la GROUP BYcláusula?

En lugar de usar

GROUP BY Nombre, ciudad, código de estado

Acabo de usar

AGRUPAR POR Publisher and Location

Solo cuando surgen tales situaciones, es útil usar backticks. En todos los demás tiempos se recomienda el uso de comillas dobles.

Mando
fuente