oracle - serie - ¿Por qué el oráculo es sensible a mayúsculas y minúsculas?
key sensitive (5)
¿Hay alguna razón por la cual Oracle distingue entre mayúsculas y minúsculas y otras como SQL Server, y MySQL no son por defecto?
Sé que hay formas de habilitar / deshabilitar la distinción entre mayúsculas y minúsculas, pero parece extraño que Oracle difiera de otras bases de datos.
También estoy tratando de entender las razones de la sensibilidad de mayúsculas y minúsculas. Puedo ver que "Tabla" y "TaBlE" se pueden considerar equivalentes y no equivalentes, pero ¿hay algún ejemplo en el que la distinción entre mayúsculas y minúsculas realmente suponga una diferencia?
Soy algo nuevo en las bases de datos y actualmente estoy tomando una clase.
De manera predeterminada, los identificadores de Oracle (nombres de tablas, columnas, etc.) no distinguen entre mayúsculas y minúsculas . Puede hacer que SELECT * FROM "My_Table" WHERE "my_field" = 1
mayúsculas y minúsculas al usar comillas a su alrededor (por ejemplo: SELECT * FROM "My_Table" WHERE "my_field" = 1
). Las palabras clave de SQL ( SELECT
, WHERE
, JOIN
, etc.) siempre distinguen entre mayúsculas y minúsculas.
Por otro lado, las comparaciones de cadenas distinguen entre mayúsculas y minúsculas (por ejemplo: WHERE field=''STRING''
solo coincidirá con las columnas donde está ''STRING''
) de forma predeterminada. Puede hacer que no NLS_COMP
mayúsculas y minúsculas configurando NLS_COMP
y NLS_SORT
en los valores apropiados (por ejemplo: LINGUISTIC
y BINARY_CI
, respectivamente).
Nota: Al consultar las vistas del diccionario de datos (p. Ej .:
dba_tables
), los nombres estarán en mayúsculas si los creó sin comillas, y las reglas de comparación de cadenas como se explican en el segundo párrafo se aplicarán aquí.
Algunas bases de datos (Oracle, IBM DB2, PostgreSQL, etc.) realizarán comparaciones de cadenas sensibles a mayúsculas y minúsculas de forma predeterminada, mientras que otras no distinguen entre mayúsculas y minúsculas (SQL Server, MySQL, SQLite). Esto no es estándar de ninguna manera, así que ten en cuenta cuáles son tus configuraciones de db.
Oracle realmente trata los nombres de campo y tabla de una manera que no distingue entre mayúsculas y minúsculas, a menos que use comillas alrededor de los identificadores. Si crea una tabla sin comillas alrededor del nombre, por ejemplo CREATE MyTable ..., el nombre de la tabla resultante se convertirá en mayúsculas (es decir, MYTABLE) y se tratará de una manera que no distingue entre mayúsculas y minúsculas. SELECT * de MYTABLE, SELECT * de MyTable, SELECT * de myTabLe coincidirán con MYTABLE (tenga en cuenta la falta de comillas alrededor del nombre de la tabla). Aquí hay un buen artículo sobre este tema que trata este tema con más detalle y compara bases de datos.
Para algunas aplicaciones, la sensibilidad a mayúsculas y minúsculas es importante y para otras no. Cualquiera que sea el DBMS que use, los requisitos del negocio deben determinar si necesita o no la senise-case. No me preocuparía demasiado por el "valor predeterminado".
Si tuviera que adivinar, diría por razones históricas / de compatibilidad hacia atrás.
Oracle apareció por primera vez en 1977, y era muy costoso computacionalmente con la tecnología en ese momento para hacer el trabajo adicional en búsquedas que no distinguen entre mayúsculas y minúsculas, por lo que simplemente optaron por las coincidencias exactas.
Tenga en cuenta también para SQL Server que la sensibilidad de mayúsculas y minúsculas se basa en la intercalación. La intercalación predeterminada no distingue entre mayúsculas y minúsculas, pero podría cambiarse para que distinga entre mayúsculas y minúsculas. Un ejemplo similar es: ¿por qué las bases de datos predeterminadas de Oracle usan un conjunto de caracteres de Europa Occidental cuando se requiere UTF para aplicaciones globales que utilizan caracteres que no son ASCII? Creo que es solo una preferencia del vendedor.