Estoy tratando de aprender la mejor manera de escribir consultas. También entiendo la importancia de ser consistente. Hasta ahora, he usado al azar comillas simples, comillas dobles y backticks sin ningún pensamiento real.
Ejemplo:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Además, en el ejemplo anterior, debe tener en cuenta que table
, col1
, val1
, etc., pueden ser variables.
¿Cuál es el estándar para esto? ¿Qué haces?
He estado leyendo respuestas a preguntas similares aquí durante aproximadamente 20 minutos, pero parece que no hay una respuesta definitiva a esta pregunta.
"tablename"
, y las comillas simples son para literales, por ejemplo'this is a some text'
. Los back-ticks nunca se usan en SQL estándar. (Si necesita incluir una comilla doble en un identificador,"odd""tablename"
'Conan O''Brien'
Respuestas:
Los backticks deben usarse para los identificadores de tabla y columna, pero solo son necesarios 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.
Las comillas simples deben usarse para valores de cadena como en la
VALUES()
lista. MySQL también admite las comillas dobles para los valores de cadena, pero las comillas simples son más ampliamente aceptadas por otros RDBMS, por lo que es un buen hábito usar comillas simples en lugar de dobles.MySQL también espera
DATE
yDATETIME
valores literales a ser de un solo citado 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 para usar el guión-
como delimitador de segmento en las cadenas de fecha.Entonces, usando su ejemplo, yo doble comillas la cadena PHP y usar comillas simples en los valores
'val1', 'val2'
.NULL
es una palabra clave de MySQL y un valor especial (no), y por lo tanto no está entre comillas.Ninguno de estos identificadores de tabla o columna son palabras reservadas o hacen uso de caracteres que requieren comillas, pero de todos modos las he citado con comillas invertidas (más sobre esto más adelante ...).
Las funciones nativas del RDBMS (por ejemplo,
NOW()
en MySQL) no se deben citar, aunque sus argumentos están sujetos a la misma cadena o reglas de cotización de identificador ya mencionadas.Interpolación variable
Los patrones de comillas para las variables no cambian, aunque si tiene la intención de interpolar las variables directamente en una cadena, debe ser entre comillas dobles en PHP. Solo asegúrese de haber escapado correctamente de las variables para su uso en SQL. ( En su lugar, se recomienda utilizar una API que admita declaraciones preparadas, como protección contra la inyección de SQL ).
Declaraciones preparadas
Cuando trabaje con declaraciones preparadas, consulte la documentación para determinar si se deben citar o no 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 las API de declaraciones más preparadas en otros idiomas:
Caracteres que requieren comillas de comillas en los identificadores:
De acuerdo con la documentación de MySQL , no necesita citar identificadores (retroceso) utilizando el siguiente conjunto de caracteres:
Puede usar caracteres más allá de ese conjunto como identificadores de tabla o columna, incluido el espacio en blanco, por ejemplo, pero luego debe citarlos (hacer retroceso).
fuente
Hay dos tipos de citas en MySQL:
'
para encerrar literales de cadena`
para encerrar identificadores como nombres de tabla y columnaY luego está
"
cuál es un caso especial. Podría usarse para uno de los propósitos mencionados anteriormente a la vez, dependiendo del servidor MySQLsql_mode
:"
carácter se puede utilizar para encerrar literales de cadena al igual que'
ANSI_QUOTES
modo, el"
carácter se puede usar para encerrar identificadores como`
La siguiente consulta producirá diferentes resultados (o errores) dependiendo del modo SQL:
ANSI_QUOTES deshabilitado
La consulta seleccionará el literal de cadena
"column"
donde la columnafoo
es igual a cadena"bar"
ANSI_QUOTES habilitado
La consulta seleccionará la columna
column
donde la columnafoo
es igual a la columnabar
Cuándo usar qué
"
para que su código se vuelva independiente de los modos SQLfuente
(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 son prácticamente cadenas WYSIWYG. PHP interpreta las cadenas entre comillas dobles para una posible sustitución de variables (los backticks en PHP no son exactamente cadenas; ejecutan un comando en el shell y devuelven el resultado).
Ejemplos:
fuente
Los backticks se usan generalmente para indicar
identifier
y también estar a salvo de usar accidentalmente las palabras clave reservadas .Por ejemplo:
Aquí los backticks 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.Lo mismo se puede hacer para los nombres de tabla y nombres de campo. Este es un muy buen hábito si envuelve su identificador de base de datos con backticks.
Ahora sobre comillas dobles y comillas simples (Michael ya lo ha mencionado).
Pero, para definir un valor, debe usar comillas simples o dobles. Veamos otro ejemplo.
Aquí he olvidado deliberadamente envolverlo
title1
con comillas. Ahora el servidor tomarátitle1
como un nombre de columna (es decir, un identificador). Entonces, para indicar que es un valor, debe usar comillas dobles o simples.Ahora, en combinación con PHP, las comillas dobles y las comillas simples hacen que su consulta sea mucho más fácil. Veamos una versión modificada de la consulta en su pregunta.
Ahora, usando comillas dobles en PHP, creará las variables
$val1
y$val2
usará sus valores creando así una consulta perfectamente válida. Me gustahará
fuente
En MySQL, estos símbolos se usan para delimitar una consulta
`
,"
,'
y()
."
o'
se usan para encerrar valores similares a cadenas"26-01-2014 00:00:00"
o'26-01-2014 00:00:00'
. Estos símbolos son sólo para las cadenas, funciones de agregado no les gustanow
,sum
omax
.`
se usa para encerrar nombres de tablas o columnas, p. ej.select `column_name` from `table_name` where id='2'
(
y)
simplemente encierra partes de una consulta, por ejemploselect `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'
.fuente
Los literales de cadena en MySQL y PHP son los mismos.
Entonces, si su cadena contiene comillas simples, entonces podría usar comillas dobles para citar la cadena, o si contiene comillas dobles, entonces podría usar comillas simples para citar la cadena. Pero si su cadena contiene comillas simples y comillas dobles, debe escapar de la que solía citar la cadena.
Principalmente, usamos comillas simples para un valor de cadena SQL, por lo que necesitamos usar comillas dobles para una cadena PHP.
Y podría usar una variable en la cadena de comillas dobles de PHP:
Pero si
$val1
o$val2
contiene comillas simples, eso hará que su SQL esté equivocado. Por lo tanto, debe escapar antes de que se use en sql; para eso sirvemysql_real_escape_string
. (Aunque una declaración preparada es mejor).fuente
En combinación de PHP y MySQL, las comillas dobles y las comillas simples hacen que el tiempo de escritura de consultas sea mucho más fácil.
Ahora, suponga que está utilizando una variable de publicación directa en la consulta MySQL y luego úsela de esta manera:
Esta es la mejor práctica para usar variables PHP en MySQL.
fuente
Aquí ha habido muchas respuestas útiles, que generalmente culminan en dos puntos.
Y como dijo @MichaelBerkowski
Sin embargo, hay un caso en el que un identificador no puede ser una palabra clave reservada o contener espacios en blanco o caracteres más allá de un conjunto limitado, sino que necesariamente requiere retrocesos a su alrededor.
EJEMPLO
123E10
es un nombre de identificador válido pero también un nombre válidoINTEGER
literal .[Sin entrar en detalles sobre cómo obtendría un nombre de identificador de este tipo], suponga que quiero crear una tabla temporal llamada
123456e6
.Sin ERROR en backticks.
ERROR cuando no usa backticks.
Sin embargo,
123451a6
es un nombre de identificador perfectamente fino (sin marcas de retroceso).Esto es completamente porque
1234156e6
también es un número exponencial.fuente
Si los valores y valores de la tabla son variables, entonces hay dos formas:
Con comillas dobles
""
la consulta completa:O
Con comillas simples
''
:Use garrapatas
``
cuando el nombre de una columna / valor sea similar a una palabra clave reservada de MySQL.Nota: Si está denotando un nombre de columna con el nombre de una tabla, use los ticks de regreso como este:
`table_name`
.`column_name`
<- Nota: excluir.
de los ticks posteriores.fuente
Las comillas simples deben usarse para valores de cadena como en la lista VALUES ().
Los backticks se usan generalmente para indicar un identificador y también para evitar el uso accidental de las palabras clave reservadas.
En combinación de PHP y MySQL, las comillas dobles y las comillas simples hacen que su consulta sea mucho más fácil.
fuente
Además de todas las respuestas (bien explicadas), no se ha mencionado lo siguiente y visito estas preguntas y respuestas con bastante frecuencia.
En una palabra; MySQL cree que desea hacer cálculos matemáticos en su propia tabla / columna e interpreta guiones como "correo electrónico" como
e
menosmail
.Descargo de responsabilidad: Entonces pensé que agregaría esto como un tipo de respuesta "FYI" para aquellos que son completamente nuevos en el trabajo con bases de datos y que pueden no entender los términos técnicos ya descritos.
fuente
Los servidores SQL y MySQL, PostgreySQL, Oracle no entienden las comillas dobles ("). Por lo tanto, su consulta debe estar libre de comillas dobles (") y solo debe usar comillas simples (').
Back-trip (`) es opcional para usar en SQL y se usa para nombre de tabla, nombre de base de datos y nombres de columna.
Si está intentando escribir una consulta en su back-end para llamar a MySQL, entonces puede usar comillas dobles (") o comillas simples (') para asignar consultas a una variable como:
Si hay un
where
declaración en su consulta y / o intentainsert
un valor y / o unupdate
valor que es una cadena, use comillas simples (') para estos valores como:Si desea mantenerse alejado de esta confusión sobre cuándo usar comillas dobles (") y comillas simples ('), le recomendamos que se quede con comillas simples ('), esto incluirá una barra diagonal inversa () como:
El problema con las comillas dobles (") o simples (') surge cuando tenemos que asignar un valor dinámico y realizar una concatenación de cadenas como:
Si necesita más autorización, siga las citas en JavaScript
fuente