¿La sintaxis SQL distingue entre mayúsculas y minúsculas?

199

Es SQL sensible a mayúsculas y minúsculas. He usado MySQL y SQL Server, que parecen ser sensibles a mayúsculas y minúsculas. Este es siempre el caso? ¿El estándar define mayúsculas y minúsculas?

Steve Tranby
fuente
1
Mayúsculas

Respuestas:

181

Las palabras clave de SQL son sensibles a mayúsculas ( SELECT, FROM, WHERE, etc.), pero a menudo están escritos en mayúsculas. Sin embargo, en algunas configuraciones, los nombres de tabla y columna distinguen entre mayúsculas y minúsculas. MySQL tiene una opción de configuración para habilitarlo / deshabilitarlo. Por lo general, los nombres de tabla y columna sensibles a mayúsculas y minúsculas son los predeterminados en Linux MySQL y los mayúsculas y minúsculas solían ser los predeterminados en Windows, pero ahora el instalador preguntó sobre esto durante la configuración. Para MSSQL es una función de la configuración de intercalación de la base de datos.

Aquí está la página de MySQL sobre el nombre de mayúsculas y minúsculas

Aquí está el artículo en MSDN sobre colaciones para MSSQL

Stefan Rusek
fuente
77
Algunos sistemas (como PostgreSQL) distinguen entre mayúsculas y minúsculas en los nombres de tablas y columnas, pero intentan ocultarlos en minúsculas o mayúsculas antes de buscarlos. En estos sistemas, deberá encerrar el nombre de la tabla entre "comillas dobles" para asegurarse de que se busca el nombre exacto que ingresó.
Michael Ratanapintha
2
"pero a menudo están escritas en mayúsculas" No estoy de acuerdo, eso es meramente una preferencia, siempre he visto lo contrario en realidad
BlackTigerX
3
Por ejemplo, si el servidor MS Sql se instala utilizando la intercalación entre mayúsculas y minúsculas, la tabla, la columna y los nombres de las variables se distinguen entre mayúsculas y minúsculas, incluso si la base de datos tiene una intercalación entre mayúsculas y minúsculas.
Vadym Stetsiak
3
@BlackTigerX: los manuales de Oracle tienen todos los ejemplos de SQL con palabras clave (SELECT, FROM, WHERE, etc.) escritas en mayúsculas, pero los nombres de tablas y columnas en minúsculas.
J. Polfer
Hmmm, ¿esto sigue siendo cierto para mysql? Pensé que tenía una instalación predeterminada de mysql, y no distingue entre mayúsculas y minúsculas para los nombres de columna.
Kzqai
22

Esto no es estrictamente lenguaje SQL, pero en SQL Server si la clasificación de su base de datos distingue entre mayúsculas y minúsculas, entonces todos los nombres de tablas distinguen entre mayúsculas y minúsculas.

Cade Roux
fuente
16

En SQL Server es una opción . Encenderlo apesta.

No estoy seguro acerca de MySql.

JosephStyons
fuente
En MySql, la insensibilidad a mayúsculas y minúsculas es una opción que puede activar y desactivar. Solo que la insensibilidad no funciona como supondría que lo haría en Linux si el sistema de archivos distingue entre mayúsculas y minúsculas (predeterminado). Debe crear un sistema de archivos que no distinga entre mayúsculas y minúsculas en Linux para que la mayúsculas y minúsculas de mysql funcione de la misma manera que en Windows (= correctamente). Especialmente encenderlo / apagarlo después de algún trabajo en otro modo puede tener malas consecuencias.
Stefan Steiger
14

Los identificadores y las palabras reservadas no deben ser sensibles a mayúsculas y minúsculas, aunque muchos siguen una convención para usar mayúsculas para palabras reservadas y mayúsculas y minúsculas para los identificadores.

Ver SQL-92 Sec. 5.2

Llavero
fuente
13

La especificación SQL92 establece que los identificadores pueden estar entre comillas o no. Si ambos lados no están entre comillas, siempre distinguen entre mayúsculas y minúsculas, p table_name == TAble_nAmE. Ej .

Sin embargo, los identificadores citados distinguen entre mayúsculas y minúsculas, por ejemplo "table_name" != "TAble_naME". También en función de la especificación si desea comparar identificadores no asignados con los citados, los identificadores sin comillas y con comillas pueden considerarse iguales, si los caracteres sin comillas están en mayúsculas, por ejemplo TABLE_NAME == "TABLE_NAME", pero TABLE_NAME != "table_name"o TABLE_NAME != "TAble_NaMe".

Aquí está la parte relevante de la especificación (sección 5.2.13):

     13)A <regular identifier> and a <delimited identifier> are equiva-
        lent if the <identifier body> of the <regular identifier> (with
        every letter that is a lower-case letter replaced by the equiva-
        lent upper-case letter or letters) and the <delimited identifier
        body> of the <delimited identifier> (with all occurrences of
        <quote> replaced by <quote symbol> and all occurrences of <dou-
        blequote symbol> replaced by <double quote>), considered as
        the repetition of a <character string literal> that specifies a
        <character set specification> of SQL_TEXT and an implementation-
        defined collation that is sensitive to case, compare equally
        according to the comparison rules in Subclause 8.2, "<comparison
        predicate>".

Tenga en cuenta que, al igual que con otras partes del estándar SQL, no todas las bases de datos siguen completamente esta sección. PostgreSQL, por ejemplo, almacena todos los identificadores sin comillas en minúsculas en lugar de mayúsculas, por table_name == "table_name"lo tanto (que es exactamente lo contrario del estándar). Además, algunas bases de datos no distinguen entre mayúsculas y minúsculas todo el tiempo, o la distinción entre mayúsculas y minúsculas depende de alguna configuración en la base de datos o depende de algunas de las propiedades del sistema, generalmente si el sistema de archivos distingue entre mayúsculas y minúsculas o no.

Tenga en cuenta que algunas herramientas de la base de datos pueden enviar identificadores citados todo el tiempo, por lo que en los casos en que combina consultas generadas por alguna herramienta (como una consulta CREATE TABLE generada por Liquibase u otra herramienta de migración de DB), con consultas hechas a mano (como una simple selección JDBC en su aplicación) debe asegurarse de que los casos sean consistentes, especialmente en bases de datos donde los identificadores entre comillas y sin comillas son diferentes (DB2, PostgreSQL, etc.)

SztupY
fuente
10

Según tengo entendido, el estándar SQL exige la insensibilidad a mayúsculas y minúsculas. Sin embargo, no creo que ninguna base de datos siga el estándar por completo.

MySQL tiene una configuración como parte de su "modo estricto" (una bolsa de varias configuraciones que hacen que MySQL sea más compatible con los estándares) para nombres de tabla que distinguen entre mayúsculas y minúsculas. Independientemente de esta configuración, los nombres de las columnas aún no distinguen entre mayúsculas y minúsculas, aunque creo que afecta cómo se muestran los nombres de las columnas. Creo que esta configuración abarca toda la instancia, en todas las bases de datos dentro de la instancia RDBMS, aunque hoy estoy investigando para confirmar esto (y espero que la respuesta sea no).

Me gusta cómo Oracle maneja esto mucho mejor. En SQL directo, los identificadores como nombres de tabla y columna no distinguen entre mayúsculas y minúsculas. Sin embargo, si por alguna razón realmente desea obtener una carcasa explícita, puede encerrar el identificador entre comillas dobles (que son bastante diferentes en Oracle SQL de las comillas simples utilizadas para encerrar datos de cadena). Entonces:

SELECT fieldName
FROM tableName;

consultará fieldname desde tablename , pero

SELECT "fieldName"
FROM "tableName";

consultará fieldName desde tableName .

Estoy bastante seguro de que incluso podría usar este mecanismo para insertar espacios u otros caracteres no estándar en un identificador.

En esta situación, si por alguna razón encontrara deseables los nombres de tabla y columna con mayúsculas y minúsculas, estaba disponible para usted, pero todavía era algo contra lo que le recomendaría mucho.

Mi convención cuando usé Oracle a diario fue que en el código pondría todas las palabras clave de Oracle SQL en mayúsculas y todos los identificadores en minúsculas. En la documentación, pondría todos los nombres de tablas y columnas en mayúsculas. Fue muy conveniente y legible poder hacer esto (aunque a veces es difícil escribir tantas mayúsculas en el código, estoy seguro de que podría haber encontrado una función de editor para ayudar aquí).

En mi opinión, MySQL es particularmente malo por diferir sobre esto en diferentes plataformas. Necesitamos poder volcar las bases de datos en Windows y cargarlas en UNIX, y hacerlo es un desastre si el instalador en Windows olvidó poner el RDBMS en modo sensible a mayúsculas y minúsculas. (Para ser justos, parte de la razón por la que esto es un desastre es que nuestros codificadores tomaron la mala decisión, hace mucho tiempo, de confiar en la distinción entre mayúsculas y minúsculas de MySQL en UNIX). Las personas que escribieron el instalador de Windows MySQL lo hicieron realmente conveniente y Como Windows, y fue genial pasar a dar a las personas una casilla de verificación para decir "¿Te gustaría activar el modo estricto y hacer que MySQL sea más compatible con los estándares?" Pero es muy conveniente que MySQL difiera significativamente del estándar, y luego empeorar las cosas al cambiar y diferir de su propio estándar de facto en diferentes plataformas. Estoy seguro de que en diferentes distribuciones de Linux esto puede complicarse aún más, ya que los empaquetadores para diferentes distribuciones probablemente a veces han incorporado sus propias configuraciones de configuración MySQL preferidas.

Aquí hay otra pregunta SO que se analiza si es deseable la distinción entre mayúsculas y minúsculas en un RDBMS.

skiphoppy
fuente
5

No. MySQL no distingue entre mayúsculas y minúsculas, y tampoco lo es el estándar SQL. Es una práctica común escribir los comandos en mayúsculas.

Ahora, si está hablando de nombres de tabla / columna, entonces sí, pero no los comandos en sí.

Entonces

SELECT * FROM foo;

es lo mismo que

select * from foo;

pero no es lo mismo que

select * from FOO;
cmcculloh
fuente
2
En la mayoría de los RDBMS, los nombres de tabla tampoco distinguen entre mayúsculas y minúsculas. Al menos no por defecto. MySQL es la excepción más destacada a esta regla.
4

Esta publicación del blog me pareció muy útil (no soy el autor). Resumiendo (por favor, lea):

... los identificadores delimitados distinguen entre mayúsculas y minúsculas ("table_name"! = "Table_Name"), mientras que los identificadores no entre comillas no lo son y se transforman en mayúsculas (table_name => TABLE_NAME).

Encontró que DB2, Oracle e Interbase / Firebird son 100% compatibles:

PostgreSQL ... pone en minúscula cada identificador sin comillas, en lugar de ponerlo en mayúsculas. MySQL ... depende del sistema de archivos. SQLite y SQL Server ... el caso de los nombres de tabla y campo se conservan en la creación, pero luego se ignoran por completo.

Matthew Cornell
fuente
2

No creo que SQL Server distinga entre mayúsculas y minúsculas, al menos no de manera predeterminada.

Cuando hago consultas manualmente a través de Management Studio, estropeo el caso todo el tiempo y lo acepta alegremente:

select cOL1, col2 FrOM taBLeName WheRE ...
Dana
fuente
2

Las palabras clave SQL no distinguen entre mayúsculas y minúsculas.

Los nombres de tablas, columnas, etc., tienen una distinción entre mayúsculas y minúsculas que depende de la base de datos; probablemente debería suponer que distinguen entre mayúsculas y minúsculas a menos que sepa lo contrario (en muchas bases de datos no lo son, sin embargo; en MySQL, los nombres de tablas son algunas veces sensibles a mayúsculas y minúsculas, pero la mayoría de los demás los nombres no son).

La comparación de datos usando =,>, <etc. tiene un reconocimiento de mayúsculas y minúsculas que depende de la configuración de intercalación que se usa en la base de datos individual, tabla o incluso columna en cuestión. Sin embargo, es normal mantener una clasificación bastante consistente dentro de una base de datos. Tenemos algunas columnas que necesitan almacenar valores sensibles a mayúsculas y minúsculas; tienen una colación específicamente establecida.

MarkR
fuente
0

Tener lo mejor de ambos mundos

En estos días, puede escribir todas sus declaraciones sql en minúsculas y si alguna vez necesita formatearlas, simplemente instale un complemento que lo haga por usted. Esto solo es aplicable si su editor de código tiene esos complementos disponibles. VSCode tiene muchas extensiones que pueden hacer esto.

Isaac Pak
fuente