minusculas mayusculas distinguir diferenciar sql case-sensitive

diferenciar - distinguir mayusculas y minusculas mysql



¿La sintaxis SQL es sensible a mayúsculas y minúsculas (10)

En Sql Server es una opción . Encenderlo es una mierda

No estoy seguro acerca de MySql.

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


Encontré esta publicación de blog que me ayudó mucho (no soy el autor). Resumiendo (por favor, lea, sin embargo):

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

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

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


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


La SQL-92 establece que los identificadores pueden ser citados, o no citados. Si ambos lados no están citados, siempre son insensibles a las mayúsculas / minúsculas, por ejemplo, table_name == TAble_nAmE .

Sin embargo, los identificadores entre comillas 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 marcados con los citados, los identificadores sin comillas y cotizados pueden considerarse iguales, si los caracteres sin comillas están en mayúscula, 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 esta sección por completo. PostgreSQL, por ejemplo, almacena todos los identificadores sin comillas en lugar de mayúsculas, por lo que table_name == "table_name" (que es exactamente lo opuesto al estándar). Además, algunas bases de datos no distinguen entre mayúsculas y minúsculas en todo momento, o la sensibilidad a las mayúsculas y minúsculas depende de alguna configuración en el DB 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 bases de datos pueden enviar identificaciones citadas todo el tiempo, por lo que cuando mezcla consultas generadas por alguna herramienta (como una consulta CREATE TABLE generada por Liquibase u otra herramienta de migración de bases de datos), con consultas hechas a mano (como una selección JDBC simple en su aplicación) debe asegurarse de que los casos sean consistentes, especialmente en las bases de datos donde los identificadores entre comillas y sin comillas son diferentes (DB2, PostgreSQL, etc.)


Las palabras clave de SQL son insensibles a mayúsculas y minúsculas.

Los nombres de las tablas, columnas, etc. tienen una sensibilidad de mayúsculas y minúsculas que depende de la base de datos. Probablemente suponga que son sensibles a las mayúsculas y minúsculas a menos que sepa lo contrario (en muchas bases de datos no lo son, en MySQL los nombres de las tablas son SOMETIMES mayúsculas y minúsculas). los nombres no son).

La comparación de datos usando =,>, <etc, tiene un conocimiento de caso que depende de la configuración de intercalación que está en uso en la base de datos, tabla o columna en cuestión. Sin embargo, es normal mantener la intercalación bastante consistente dentro de una base de datos. Tenemos algunas columnas que necesitan almacenar valores que distingan entre mayúsculas y minúsculas; tienen una recopilación establecida específicamente.


Los identificadores y las palabras reservadas no deben distinguir entre mayúsculas y minúsculas, aunque muchos siguen una convención para usar mayúsculas para palabras reservadas y el caso de Pascal para identificadores.

Ver SQL-92 Sec. 5.2


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

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

select cOL1, col2 FrOM taBLeName WheRE ...


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úscula.

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

Asi que

SELECT * FROM foo;

es lo mismo que

select * from foo;

pero no es lo mismo que

select * from FOO;


Tengo entendido que el estándar SQL requiere 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 de configuración como parte de su "modo estricto" (un conjunto de varias configuraciones que hacen que MySQL sea más compatible con los estándares) para nombres de tablas sensibles o insensibles a 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 la forma en que se muestran los nombres de las columnas. Creo que esta configuración es para toda la instancia, en todas las bases de datos dentro de la instancia RDBMS, aunque estoy investigando hoy 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 los nombres de tabla y columna no distinguen entre mayúsculas y minúsculas. Sin embargo, si por alguna razón realmente desea obtener mayúsculas y minúsculas explícitamente, puede encerrar el identificador entre comillas dobles (que son bastante diferentes en Oracle SQL a partir de las comillas simples utilizadas para encerrar los datos de cadena). Asi que:

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 algún motivo encontraras nombres de tabla y columna explícitamente deseados, estaría disponible para ti, pero aún así era algo contra lo que sería sumamente precavido.

Mi convención cuando usaba Oracle a diario era que en el código colocaba 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 fácil de leer para poder hacer esto (aunque a veces es un fastidio escribir tantas mayúsculas en código; estoy seguro de que podría haber encontrado una función de editor para ayudar, aquí).

En mi opinión, MySQL es especialmente malo para diferir sobre esto en diferentes plataformas. Necesitamos poder volcar bases de datos en Windows y cargarlas en UNIX, y hacerlo es un desastre si el instalador en Windows olvidó poner el RDBMS en el modo de 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 MySQL de Windows lo hicieron realmente conveniente y Como Windows, y fue genial avanzar hacia darles a las personas una casilla 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 para MySQL diferir significativamente del estándar, y luego empeorar las cosas cambiando y difiriendo 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 hayan incorporado a veces sus propias configuraciones preferidas de configuración de MySQL.

Here otra pregunta que entra en discusión sobre si la sensibilidad a mayúsculas / minúsculas es deseable en un RDBMS.


Las palabras clave SQL no distinguen entre mayúsculas y minúsculas ( SELECT , FROM , WHERE , etc.), pero a menudo se escriben con 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 que distinguen entre mayúsculas y minúsculas son los predeterminados en Linux MySQL y los que no distinguen entre mayúsculas y minúsculas solían ser los predeterminados en Windows, pero ahora el instalador preguntó sobre esto durante la instalació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