minuscole - sql prima lettera maiuscola




La sintassi SQL è sensibile al maiuscolo/minuscolo? (7)

Gli identificatori e le parole riservate non dovrebbero essere case sensitive, sebbene molti seguano una convenzione per utilizzare le maiuscole per le parole riservate e il caso Pascal per gli identificatori.

Vedi SQL-92 Sec. 5.2

È SQL case sensitive. Ho usato MySQL e SQL Server che sembrano entrambi sensibili al caso. È sempre così? Lo standard definisce la case-sensitivity?


Ho trovato questo post del blog molto utile (non sono l'autore). Riepilogando (si prega di leggere, però):

... gli identificatori delimitati sono case sensitive ("table_name"! = "Table_Name"), mentre gli identificatori non quotati non lo sono e vengono trasformati in maiuscolo (table_name => TABLE_NAME).

Ha trovato DB2, Oracle e Interbase / Firebird sono al 100% conformi:

PostgreSQL ... mette in minuscolo ogni identificatore non quotato, invece di sovrascriverlo. MySQL ... dipendente dal file system. SQLite e SQL Server ... i casi dei nomi di tabelle e campi vengono mantenuti durante la creazione, ma in seguito vengono completamente ignorati.


La SQL-92 afferma che gli identificatori potrebbero essere quotati o non quotati. Se entrambi i lati non sono quotati, sono sempre senza distinzione tra maiuscole e minuscole, ad esempio table_name == TAble_nAmE .

Tuttavia gli identificatori citati sono case-sensitive, ad esempio "table_name" != "TAble_naME" . Anche in base alle specifiche se desideri confrontare gli identificatori non aggiornati con quelli quotati, allora gli identificatori non quotati e quotati possono essere considerati uguali, se i caratteri non quotati sono maiuscoli, ad esempio TABLE_NAME == "TABLE_NAME" , ma TABLE_NAME != "table_name" o TABLE_NAME != "TAble_NaMe" .

Ecco la parte rilevante della specifica (sezione 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>".

Nota che, proprio come con altre parti dello standard SQL, non tutti i database seguono completamente questa sezione. PostgreSQL per esempio memorizza tutti gli identificatori non quotati in minuscolo anziché in maiuscolo, quindi table_name == "table_name" (che è esattamente l'opposto dello standard). Inoltre, alcuni database non fanno mai distinzione tra maiuscole e minuscole, oppure la sensibilità alla distinzione tra maiuscole e minuscole dipende da alcune impostazioni nel DB o dipende da alcune proprietà del sistema, in genere dal fatto che il filesystem non distingue tra maiuscole e minuscole.

Si noti che alcuni strumenti di database potrebbero inviare identificatori quotati tutto il tempo, quindi nei casi in cui si mescolano query generate da alcuni strumenti (come una query CREATE TABLE generata da Liquibase o altro strumento di migrazione DB), con query fatte manualmente (come una semplice selezione JDBC) nella tua applicazione) devi assicurarti che i casi siano coerenti, specialmente sui database in cui gli identificatori quotati e non quotati sono diversi (DB2, PostgreSQL, ecc.)


La mia comprensione è che lo standard SQL richiede insensibilità alle maiuscole e minuscole. Non credo che nessun database segua completamente lo standard, comunque.

MySQL ha un'impostazione di configurazione come parte della sua "modalità rigorosa" (un sacco di diverse impostazioni che rendono MySQL più conforme agli standard) per i nomi delle tabelle sensibili al maiuscolo o minuscolo. Indipendentemente da questa impostazione, i nomi delle colonne sono ancora insensibili alle maiuscole e minuscole, anche se penso che influenzi il modo in cui vengono visualizzati i nomi delle colonne. Credo che questa impostazione sia estesa a tutta l'istanza, su tutti i database all'interno dell'istanza RDBMS, sebbene io stia facendo ricerche oggi per confermare questo (e sperando che la risposta sia no).

Mi piace come Oracle gestisce meglio questo. In SQL diritta, gli identificativi come i nomi di tabelle e colonne non fanno distinzione tra maiuscole e minuscole. Tuttavia, se per qualche motivo desideri davvero ottenere un involucro esplicito, puoi racchiudere l'identificatore tra virgolette (che sono abbastanza diverse in Oracle SQL dalle virgolette singole utilizzate per racchiudere i dati di stringa). Così:

SELECT fieldName
FROM tableName;

interrogherà fieldname da tablename , ma

SELECT "fieldName"
FROM "tableName";

interrogherà fieldName da tableName .

Sono abbastanza sicuro che potresti persino usare questo meccanismo per inserire spazi o altri caratteri non standard in un identificatore.

In questa situazione, se per qualche motivo hai trovato desiderabili i nomi delle tabelle e delle colonne espressamente castrati, era a tua disposizione, ma era ancora qualcosa a cui vorrei essere molto cauto.

La mia convenzione quando usavo Oracle quotidianamente era che nel codice avrei messo tutte le parole chiave Oracle SQL in maiuscolo e tutti gli identificatori in minuscolo. Nella documentazione avrei messo tutti i nomi di tabelle e colonne in maiuscolo. È stato molto comodo e leggibile poterlo fare (anche se a volte è difficile scrivere tante lettere maiuscole nel codice - sono sicuro che avrei potuto trovare una funzione di editor per aiutare, qui).

Secondo me, MySQL è particolarmente negativo per differenze su questo su piattaforme diverse. Dobbiamo essere in grado di scaricare database su Windows e caricarli in UNIX, e fare così è un disastro se il programma di installazione su Windows ha dimenticato di mettere l'RDBMS in modalità case-sensitive. (Per essere onesti, parte del motivo per cui questo è un disastro è che i nostri programmatori hanno preso la cattiva decisione, molto tempo fa, di affidarsi alla case-sensitive di MySQL su UNIX.) Le persone che hanno scritto il programma di installazione di Windows MySQL lo hanno reso molto comodo e Simile a Windows, ed è stato fantastico passare a dare alle persone una casella di controllo per dire "Vorresti attivare la modalità rigorosa e rendere MySQL più conforme agli standard?" Ma è molto conveniente per MySQL differire in modo così significativo dallo standard, e quindi peggiorare le cose girando e differenziandosi dal suo standard di fatto su piattaforme diverse. Sono sicuro che su diverse distribuzioni Linux questo potrebbe essere ulteriormente aggravato, dato che i packer per diverse distribuzioni hanno a volte incorporato le proprie impostazioni di configurazione MySQL preferite.

Here un'altra domanda SO che entra in discussione se la sensibilità alle maiuscole e minuscole è auspicabile in un RDBMS.


No. MySQL non è case sensitive e nessuno dei due è lo standard SQL. È solo una pratica comune scrivere i maiuscoli.

Ora, se stai parlando di nomi di tabelle / colonne, allora sì, ma non i comandi stessi.

Così

SELECT * FROM foo;

equivale a

select * from foo;

ma non lo stesso di

select * from FOO;

Non penso che SQL Server sia sensibile al maiuscolo / minuscolo, almeno non di default.

Quando sto interrogando manualmente tramite Management Studio, rovino tutto il tempo e lo accetto allegramente:

select cOL1, col2 FrOM taBLeName WheRE ...

Le parole chiave SQL non fanno distinzione tra maiuscole e minuscole ( SELECT , FROM , WHERE , ecc.), Ma sono spesso scritte in maiuscolo. Tuttavia, in alcune configurazioni, la tabella e i nomi delle colonne sono sensibili al maiuscolo / minuscolo. MySQL ha un'opzione di configurazione per abilitarlo / disabilitarlo. Solitamente i nomi delle tabelle e delle colonne con distinzione tra maiuscole e minuscole sono predefiniti su Linux MySQL e l'insensibilità alle maiuscole e minuscole era l'impostazione predefinita su Windows, ma ora l'installer ha chiesto questo durante l'installazione. Per MSSQL è una funzione delle impostazioni di confronto del database.

Ecco la pagina MySQL su name case-sensitivity

Ecco l' articolo in MSDN sulle regole di confronto per MSSQL





case-sensitive