SQL distingue tra maiuscole e minuscole. Ho usato MySQL e SQL Server che sembrano entrambi sensibili al maiuscolo / minuscolo. È sempre così? Lo standard definisce la distinzione tra maiuscole e minuscole?
SQL distingue tra maiuscole e minuscole. Ho usato MySQL e SQL Server che sembrano entrambi sensibili al maiuscolo / minuscolo. È sempre così? Lo standard definisce la distinzione tra maiuscole e minuscole?
Risposte:
Le parole chiave SQL sono (case-insensitive SELECT
, FROM
, WHERE
, ecc), ma sono spesso scritti in tutte le protezioni. Tuttavia, in alcune configurazioni, i nomi di tabelle e colonne fanno distinzione tra maiuscole e minuscole. MySQL ha un'opzione di configurazione per abilitarlo / disabilitarlo. Di solito i nomi di tabelle e colonne con distinzione tra maiuscole e minuscole sono i valori predefiniti su MySQL Linux e il distinzione tra maiuscole e minuscole era quello predefinito su Windows, ma ora il programma di installazione lo ha chiesto durante l'installazione. Per MSSQL è una funzione delle impostazioni di confronto del database.
Ecco la pagina MySQL sulla distinzione tra maiuscole e minuscole
Ecco l' articolo in MSDN sulle regole di confronto per MSSQL
In SQL Server è un'opzione . L'accensione fa schifo.
Non sono sicuro di MySql.
Gli identificatori e le parole riservate non devono fare distinzione tra maiuscole e minuscole, sebbene molti seguano una convenzione per usare le maiuscole per le parole riservate e il caso Pascal per gli identificatori.
Vedi SQL-92 Sec. 5.2
La specifica SQL92 afferma che gli identificatori potrebbero essere citati o non quotati. Se entrambe le parti non sono quotate, non fanno mai distinzione tra maiuscole e minuscole, ad es table_name == TAble_nAmE
.
Tuttavia, gli identificatori citati fanno distinzione tra maiuscole e minuscole, ad es "table_name" != "TAble_naME"
. Inoltre, in base alle specifiche, se si desidera confrontare gli identificatori non quotati con quelli tra virgolette, gli identificatori non quotati e citati 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 pertinente delle specifiche (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>".
Si noti che, proprio come con altre parti dello standard SQL, non tutti i database seguono completamente questa sezione. PostgreSQL, ad esempio, memorizza tutti gli identificatori non quotati in minuscolo anziché 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 distinzione tra maiuscole e minuscole dipende da alcune impostazioni nel DB o dipende da alcune delle proprietà del sistema, di solito indipendentemente dal fatto che il filesystem sia sensibile al maiuscolo / minuscolo.
Si noti che alcuni strumenti di database potrebbero inviare identificatori quotati continuamente, quindi nei casi in cui si mescolano query generate da alcuni strumenti (come una query CREATE TABLE generata da Liquibase o altri strumenti di migrazione DB), con query fatte a mano (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 la distinzione tra maiuscole e minuscole. Non credo che nessun database segua completamente lo standard.
MySQL ha un'impostazione di configurazione come parte della sua "modalità rigorosa" (una serie di impostazioni diverse che rendono MySQL più conforme agli standard) per i nomi di tabelle sensibili al maiuscolo / minuscolo. Indipendentemente da questa impostazione, i nomi delle colonne sono ancora senza distinzione tra maiuscole e minuscole, anche se penso che influenzi la modalità di visualizzazione dei nomi delle colonne. Credo che questa impostazione sia a livello di istanza, in tutti i database all'interno dell'istanza RDBMS, anche se oggi sto cercando di confermarlo (e spero che la risposta sia no).
Mi piace come Oracle gestisce questo molto meglio. In SQL semplice, identificatori come nomi di tabelle e colonne non fanno distinzione tra maiuscole e minuscole. Tuttavia, se per qualche motivo desideri davvero ottenere il case esplicito, puoi racchiudere l'identificatore tra virgolette doppie (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 nomi di tabelle e colonne espressamente racchiusi, questo era a tua disposizione, ma era comunque qualcosa a cui avrei fortemente sconsigliato.
La mia convenzione quando usavo Oracle su base giornaliera era che nel codice avrei messo tutte le parole chiave Oracle SQL in maiuscolo e tutti gli identificatori in minuscolo. Nella documentazione metterei tutti i nomi di tabella e colonna in maiuscolo. È stato molto conveniente e leggibile poterlo fare (anche se a volte è un problema digitare così tante maiuscole nel codice - sono sicuro che avrei potuto trovare una funzione di editor per aiutare, qui).
A mio avviso, MySQL è particolarmente dannoso per le differenze su questo su piattaforme diverse. Dobbiamo essere in grado di scaricare database su Windows e caricarli in UNIX, e farlo è un disastro se il programma di installazione su Windows ha dimenticato di mettere RDBMS in modalità sensibile al maiuscolo / minuscolo. (Per essere onesti, parte del motivo per cui questo è un disastro è che i nostri programmatori hanno preso la cattiva decisione, molto tempo fa, di fare affidamento sulla distinzione tra maiuscole e minuscole di MySQL su UNIX.) Le persone che hanno scritto il programma di installazione di MySQL per Windows lo hanno reso davvero conveniente e Simile a Windows, ed è stato fantastico passare a dare alle persone una casella di controllo per dire "Ti piacerebbe attivare la modalità rigorosa e rendere MySQL più conforme agli standard?" Ma è molto comodo che MySQL differisca in modo così significativo dallo standard, e poi peggiora le cose girandoti e differendo dal suo standard di fatto su piattaforme diverse. Sono sicuro che su diverse distribuzioni Linux questo potrebbe essere ulteriormente aggravato, poiché i packager per diverse distribuzioni probabilmente hanno talvolta incorporato le proprie impostazioni di configurazione MySQL preferite.
Ecco un'altra domanda SO che si propone di discutere se la distinzione tra maiuscole e minuscole sia desiderabile in un RDBMS.
No. MySQL non distingue tra maiuscole e minuscole, né lo standard SQL. È pratica comune scrivere i comandi in maiuscolo.
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;
Ho trovato questo post sul blog molto utile (non sono l'autore). Riassumendo (leggi, comunque):
... gli identificatori delimitati fanno distinzione tra maiuscole e minuscole ("table_name"! = "Table_Name"), mentre gli identificatori non quotati non lo sono e vengono trasformati in maiuscolo (table_name => TABLE_NAME).
Ha scoperto che DB2, Oracle e Interbase / Firebird sono conformi al 100%:
PostgreSQL ... minuscolo ogni identificatore non quotato, invece di maiuscola. MySQL ... dipendente dal file system. SQLite e SQL Server ... il caso della tabella e i nomi dei campi vengono conservati al momento della creazione, ma successivamente vengono completamente ignorati.
Le parole chiave SQL non fanno distinzione tra maiuscole e minuscole.
I nomi di tabelle, colonne ecc. Hanno una distinzione tra maiuscole e minuscole che dipende dal database - dovresti probabilmente presumere che siano case sensitive a meno che tu non sappia diversamente (In molti database non lo sono; in MySQL i nomi delle tabelle sono SOMETIMES case sensitive ma la maggior parte degli altri i nomi non lo sono).
Il confronto dei dati utilizzando =,>, <ecc. Ha una distinzione tra maiuscole e minuscole che dipende dalle impostazioni di confronto che sono in uso sul singolo database, tabella o persino colonna in questione. È normale, tuttavia, mantenere le regole di confronto abbastanza coerenti all'interno di un database. Abbiamo alcune colonne che devono memorizzare valori sensibili al maiuscolo / minuscolo; hanno una collazione specificatamente impostata.
Avere il meglio di entrambi i mondi
In questi giorni puoi semplicemente scrivere tutte le tue istruzioni sql in minuscolo e se mai hai bisogno di averlo formattato, installa un plug-in che lo farà per te. Questo è applicabile solo se l'editor di codice ha quei plugin disponibili. VSCode ha molte estensioni che possono farlo.