Cuándo usar comillas simples, comillas dobles y comillas invertidas en MySQL
Estoy tratando de aprender la mejor manera de escribir consultas. También entiendo la importancia de ser consistente. Hasta ahora, he utilizado comillas simples, comillas dobles y comillas invertidas al azar sin pensarlo mucho.
Ejemplo:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Además, en el ejemplo anterior, considere que table
, col1
, val1
, etc. pueden ser variables.
¿Cuál es el estándar para esto? ¿A qué te dedicas?
Las comillas invertidas se deben usar para identificadores de tablas y columnas, pero solo son necesarias cuando el identificador es una palabra clave reservada de MySQL o cuando el identificador contiene espacios en blanco o caracteres más allá de un conjunto limitado (ver más abajo). A menudo se recomienda evitar el uso de palabras clave reservadas. como identificadores de columna o tabla cuando sea posible, evitando el problema de las citas.
Se deben utilizar comillas simples para valores de cadena como en la VALUES()
lista. MySQL también admite comillas dobles para valores de cadena, pero otros RDBMS aceptan más ampliamente las comillas simples, por lo que es un buen hábito utilizar comillas simples en lugar de dobles.
MySQL también espera DATE
que DATETIME
los valores literales estén entre comillas simples como cadenas como '2001-01-01 00:00:00'
. Consulte la documentación de Literales de fecha y hora para obtener más detalles, en particular alternativas al uso del guión -
como delimitador de segmento en cadenas de fecha.
Entonces, usando su ejemplo, pondría comillas dobles en la cadena PHP y usaría comillas simples en los valores 'val1', 'val2'
. NULL
es una palabra clave de MySQL y un valor (no) especial y, por lo tanto, no está entre comillas.
Ninguno de estos identificadores de tablas o columnas son palabras reservadas ni utilizan caracteres que requieran comillas, pero los he citado de todos modos con comillas invertidas (más sobre esto más adelante...).
Las funciones nativas del RDBMS (por ejemplo, NOW()
en MySQL) no deben citarse, aunque sus argumentos están sujetos a las mismas reglas de citación de cadenas o identificadores ya mencionadas.
Comilla invertida (`) tabla y columna ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬─ ───┬──┬ ───────┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ $consulta = " INSERTAR EN `tabla` (`id`, `col1`, `col2`, `fecha`, `actualizado`) VALORES (NULL, 'val1', 'val2', '2001-01-01', AHORA()) "; ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ Palabra clave sin comillas ─────┴┴┴┘ │ │ │ │ │ │ │││││ Cadenas entre comillas simples (') ───────────┴────┴──┴────┘ │ │ │││││ Comillas simples (') FECHA ───────────────────────────┴────────── ┘ ││││ │ Función sin comillas ─────────────────────────────────────── ──┴┴┴┴┘
Interpolación de variables
Los patrones de cotización de las variables no cambian, aunque si pretende interpolar las variables directamente en una cadena, debe estar entre comillas dobles en PHP. Solo asegúrese de haber escapado correctamente las variables para usar en SQL. ( Se recomienda utilizar una API que admita declaraciones preparadas, como protección contra la inyección de SQL ).
// Lo mismo ocurre con algunos reemplazos de variables // Aquí, el nombre de una tabla de variables $table está entrecomillada y las variables // en la lista VALORES están entre comillas simples $consulta = "INSERTAR EN `$tabla` (`id`, `col1`, `col2`, `fecha`) VALORES (NULL, '$val1' , '$val2' , '$fecha' )";
Declaraciones preparadas
Cuando trabaje con declaraciones preparadas, consulte la documentación para determinar si se deben citar los marcadores de posición de la declaración. Las API más populares disponibles en PHP, PDO y MySQLi esperan marcadores de posición sin comillas , al igual que la mayoría de las API de declaraciones preparadas en otros idiomas:
// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";
// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";
Caracteres que requieren comillas invertidas en los identificadores:
Según la documentación de MySQL , no es necesario citar (comillas invertidas) los identificadores utilizando el siguiente conjunto de caracteres:
ASCII:
[0-9,a-z,A-Z$_]
(letras latinas básicas, dígitos del 0 al 9, dólar, guión bajo)
Puede utilizar caracteres más allá de los establecidos como identificadores de tabla o columna, incluidos los espacios en blanco, por ejemplo, pero luego debe entrecomillarlos (comilla invertida).
Además, aunque los números son caracteres válidos para identificadores, los identificadores no pueden consistir únicamente en números. Si lo hacen, deben estar entre comillas invertidas.
En MySQL tienes:
'single quotes'
para encerrar literales de cadena`Backticks`
para incluir identificadores como nombres de tablas y columnas
Y luego tenemos "double quotes"
cuál podría usarse para uno de los propósitos anteriores a la vez dependiendo del servidor MySQL sql_mode
:
- En la configuración estándar, el
"
carácter se puede utilizar para encerrar cadenas literales como'
- En
ANSI_QUOTES
modo, el"
carácter se puede utilizar para encerrar identificadores como`
La siguiente consulta producirá diferentes resultados (o errores) según el modo SQL:
SELECT "column" FROM table WHERE foo = "bar"
ANSI_QUOTES deshabilitado
La consulta seleccionará el literal de cadena "column"
donde la columna foo
es igual a la cadena."bar"
ANSI_QUOTES habilitado
La consulta seleccionará la columna column
donde la columna foo
es igual a la columnabar
cuando usar que
- Le sugiero que evite el uso
"
para que su código se vuelva independiente de los modos SQL. - Cite siempre los identificadores ya que es una buena práctica.
(Hay buenas respuestas anteriores con respecto a la naturaleza SQL de su pregunta, pero esto también puede ser relevante si es nuevo en PHP).
Quizás sea importante mencionar que PHP maneja cadenas entre comillas simples y dobles de manera diferente...
Las cadenas entre comillas simples son 'literales' y prácticamente son cadenas WYSIWYG. PHP interpreta las cadenas entre comillas dobles para una posible sustitución de variables (las comillas invertidas en PHP no son exactamente cadenas; ejecutan un comando en el shell y devuelven el resultado).
Ejemplos:
$foo = "bar";
echo 'there is a $foo'; // There is a $foo
echo "there is a $foo"; // There is a bar
echo `ls -l`; // ... a directory list
Las comillas invertidas se utilizan generalmente para indicar una palabra clave reservadaidentifier
y evitar el uso accidental de ella .
Por ejemplo:
Use `database`;
Aquí, las comillas inversas ayudarán al servidor a comprender que, database
de hecho, es el nombre de la base de datos, no el identificador de la base de datos.
Se puede hacer lo mismo con los nombres de las tablas y los nombres de los campos. Este es un muy buen hábito si ajusta el identificador de su base de datos con comillas invertidas.
Consulte esta respuesta para comprender más sobre las comillas invertidas.
Ahora sobre las comillas dobles y las comillas simples (Michael ya lo ha mencionado).
Pero para definir un valor debe utilizar comillas simples o dobles. Veamos otro ejemplo.
INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);
Aquí me he olvidado deliberadamente de poner title1
entre comillas. Ahora el servidor tomará title1
como nombre de columna (es decir, un identificador). Entonces, para indicar que es un valor, debe usar comillas simples o dobles.
INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1');
Ahora, en combinación con PHP, las comillas dobles y las comillas simples facilitan mucho el tiempo de redacción de consultas. Veamos una versión modificada de la consulta en su pregunta.
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
Ahora, usando comillas dobles en PHP, crearás las variables $val1
y $val2
usarás sus valores creando así una consulta perfectamente válida. Como
$val1 = "my value 1";
$val2 = "my value 2";
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
hará
INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2')
En MySQL, estos símbolos se utilizan para delimitar una consulta `
, "
y '
.()
"
o'
se utilizan para encerrar valores similares a cadenas"26-01-2014 00:00:00"
o'26-01-2014 00:00:00'
. Estos símbolos son solo para cadenas, no para funciones agregadas comonow
,sum
omax
.`
se utiliza para encerrar nombres de tablas o columnas, por ejemploselect `column_name` from `table_name` where id='2'
(
y)
simplemente incluya partes de una consulta, por ejemploselect `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'
.
Ha habido muchas respuestas útiles aquí, que generalmente culminan en dos puntos.
- BACKTICKS(`) se utilizan alrededor de los nombres de identificadores.
- Las COTILLAS SIMPLES(') se utilizan alrededor de los valores.
Y como dijo @MichaelBerkowski
Las comillas invertidas se deben usar para identificadores de tablas y columnas, pero solo son necesarias cuando el identificador es una
MySQL
palabra clave reservada o cuando el identificador contiene espacios en blanco o caracteres más allá de un conjunto limitado (consulte a continuación). A menudo se recomienda evitar el uso de palabras clave reservadas como identificadores de columna o tabla cuando sea posible, evitando el problema de las citas.
Sin embargo, existe un caso en el que un identificador no puede ser una palabra clave reservada ni contener espacios en blanco o caracteres más allá del conjunto limitado , sino que necesariamente requiere comillas invertidas a su alrededor.
EJEMPLO
123E10
es un nombre de identificador válido pero también un INTEGER
literal válido.
[Sin entrar en detalles sobre cómo se obtendría dicho nombre de identificador], supongamos que quiero crear una tabla temporal llamada 123456e6
.
No hay ERROR en las comillas invertidas.
DB [XXX]> create temporary table `123456e6` (`id` char (8));
Query OK, 0 rows affected (0.03 sec)
ERROR al no utilizar comillas invertidas.
DB [XXX]> create temporary table 123451e6 (`id` char (8));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1
Sin embargo, 123451a6
es un nombre de identificador perfectamente válido (sin marcas inversas).
DB [XXX]> create temporary table 123451a6 (`id` char (8));
Query OK, 0 rows affected (0.03 sec)
Esto se debe completamente a que 1234156e6
también es un número exponencial.