Cuándo usar comillas simples, comillas dobles y comillas invertidas en MySQL

Resuelto Nate asked hace 12 años • 13 respuestas

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?

Nate avatar Jul 04 '12 08:07 Nate
Aceptado

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 DATEque DATETIMElos 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'. NULLes 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.

Michael Berkowski avatar Jul 04 '2012 01:07 Michael Berkowski

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_QUOTESmodo, 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 fooes igual a la cadena."bar"

ANSI_QUOTES habilitado

La consulta seleccionará la columna columndonde la columna fooes 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.
Salman A avatar Jan 02 '2013 14:01 Salman A

(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
Chris Trahey avatar Jul 04 '2012 02:07 Chris Trahey

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, databasede 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 title1entre comillas. Ahora el servidor tomará title1como 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 $val1y $val2usará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')
Starx avatar Jul 04 '2012 02:07 Starx

En MySQL, estos símbolos se utilizan para delimitar una consulta `, "y '.()

  1. "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 como now, sumo max.

  2. ` se utiliza para encerrar nombres de tablas o columnas, por ejemploselect `column_name` from `table_name` where id='2'

  3. (y )simplemente incluya partes de una consulta, por ejemplo select `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'.

Kumar Rakesh avatar Jan 03 '2017 11:01 Kumar Rakesh

Ha habido muchas respuestas útiles aquí, que generalmente culminan en dos puntos.

  1. BACKTICKS(`) se utilizan alrededor de los nombres de identificadores.
  2. 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 MySQLpalabra 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

123E10es un nombre de identificador válido pero también un INTEGERliteral 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, 123451a6es 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 1234156e6también es un número exponencial.

 avatar Jan 28 '2017 07:01