¿Debo usar backticks o no cuando escapo palabras key en MySQL?

¿Deberían includese todos los nombres de las tablas en MySQL en los backticks (`) para evitar colisiones con palabras key reservadas? La razón por la que pregunto es porque su uso hace que el SQL sea less portátil, ya que no todas las bases de datos permiten los ticks.

Entonces, ¿sería mejor evitar los nombres de tabla y columna que contienen palabras key? Si es así, ¿qué se puede hacer para mitigar el riesgo de que MySQL agregue una nueva palabra key en la próxima versión que pueda colisionar con su esquema?

¿Hay una mejor práctica con respecto a esto?

La forma más portátil (entre los sistemas) es usar comillas dobles, sin embargo, requeriría habilitar ANSI_QUOTES que está desactivado de manera pnetworkingeterminada en la mayoría de las instalaciones.

Así que mientras se mantiene la compatibilidad posiblemente discutible entre diferentes motores (y la incompatibilidad no se limita solo a las palancas, sino a un billón de otras cosas diferentes entre MySQL y otros sistemas) está matando la compatibilidad entre las diferentes configuraciones de MySQL que es mucho más importante.

Evitar las palabras key reservadas es siempre la mejor solución.

Esta es una cuestión de opinión. Pero el código portátil pesa más que su uso. Como ha notado, los backticks pueden permitirle usar palabras reservadas, lo cual nunca es algo bueno. Eso, para mí, ya demuestra que hacen más daño que bien.

Entonces, ¿sería mejor evitar los nombres de tabla y columna que contienen palabras key?

En resumen, sí. Y no hay mucho que pueda hacer con respecto a las palabras key futuras, salvo evitar candidatos obvios, por ejemplo, with window , over , etc.

Una práctica común es ponerle un prefijo a todos los nombres de la tabla con algunas letras y un guión bajo. Previene las colisiones si necesita alojar dos aplicaciones diferentes en la misma database, y es probable que nunca se encuentre con palabras reservadas.

No escapingse y evitar manualmente las colisiones de nombres reservados con palabras key puede ser un esfuerzo tedioso ya que los nombres reservados varían mucho entre las bases de datos. Por ejemplo, puede usar User en MySQL pero no en MSSQL.

También se networkinguce a lo que apuntan las consultas SQL: ¿son consultas de creación de tablas? consultas de initialization? consultas "regulares"? Esto es importante ya que hay otros factores que harán que la database SQL sea dependiente (por ejemplo, el uso de AUTO_INCREMENT al crear una tabla).

También depende si se trata de files SQL escritos a mano que carga y ejecuta directamente en la database o comstackdos programáticamente. En este último caso, usaría las instalaciones disponibles o escribiría un microcontroller que encapsula las especificidades del dialecto de la database. No estamos hablando de ORM aquí, solo algo que ayudará a encapsular este problema.

Para mí, la respuesta "intente evitarlos" es un path de solución de menor resistencia que podría o no morderlo en algún momento dependiendo del rol de sus consultas. ¿Tal vez tu pregunta es demasiado amplia?

No me preocupan mucho los problemas de portabilidad que pueden manejarse con la automation.

El SQL estándar no tiene ningún uso para backticks. Entonces, ¿no se pueden replace los backticks en DDL simplemente globalmente con comillas dobles estándar de SQL? Si es así, es solo una línea en un file make.

Si usa los backticks, evitará que su código deje de funcionar si MySQL introduce una nueva palabra key reservada. ¡Imagine todos los sitios web que creó, todos deteniéndose para trabajar porque una actualización de MySQL introdujo una nueva palabra key que utilizó previamente como nombre de tabla!

Su SQL puede ser un poco less portátil, pero en realidad … replace un backtick con una comilla doble es una cuestión de una sola búsqueda / reemploop en un file (a less que esté usando también el operador PHP backtick execute en el mismo file). No puede hacer esto a la inversa: reemplace las comillas dobles por las de respaldo, ya que también se pueden cambiar otras cadenas (todo para el operador PHP "ejecutar", ¡uf!)!

O si desea que el código sea compatible con ambos, puede replace algunas funciones que procesan / preparan el SQL:

 function myExecute($sql,$params) { if(NOT_MYSQL) $sql=str_replace('`','"',$sql); return execute($sql,$params); } 

Lo que NUNCA debes hacer es usar comillas dobles para encerrar los valores de cadena en SQL. Está permitido por MySQL, pero muy malo para la portabilidad. Puede que tenga que replace todas sus cadenas manualmente.

 <?php // Don't. Use ' for strings instead $sql='SELECT "col1" FROM "tab" WHERE "col2"="very bad"'; // Better $sql="SELECT `col1` FROM `tab` WHERE `col2`='not that bad'"; // May crash later if tab becomes a keyword (or col1, or col2,..) $sql="SELECT col1 FROM tab WHERE col2='not that bad'"; // Standard. But harder to replace ""s to ``s later, and annoying \'s in code $sql='SELECT "col1" FROM "tab" WHERE "col2"=\'not that bad\''; // Safe. Annoying. $sql="SELECT my_unique_col1 FROM my_unique_tab WHERE my_unique_col2='not that bad'"; ?> 

Como puede ver en el último ejemplo, puede nombrar sus tablas y campos de una manera que probablemente sea única (agregue algún prefijo a todos, en este caso "my_unique_"), es aburrido, pero sobre todo seguro y portátil.