La sintassi SQL fa distinzione tra maiuscole e minuscole?


Risposte:


181

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


7
Alcuni sistemi (come PostgreSQL) fanno distinzione tra maiuscole e minuscole nei nomi di tabelle e colonne, ma tentano di nasconderli con la minuscola o la maiuscola di tutti i nomi prima di cercarli. Su questi sistemi dovrai racchiudere il nome della tabella tra virgolette doppie per assicurarti che venga cercato il nome esatto che hai inserito.
Michael Ratanapintha,

2
"ma sono spesso scritti in maiuscolo" Non sono d'accordo, è solo una preferenza, in realtà ho sempre visto il contrario
BlackTigerX

3
Ad esempio, se il server MS Sql è installato utilizzando regole di confronto con distinzione tra maiuscole e minuscole, quindi i nomi delle variabili, tabella, colonna e maiuscole e minuscole, anche se nel database sono presenti regole di confronto senza distinzione tra maiuscole e minuscole.
Vadym Stetsiak,

3
@BlackTigerX - I manuali di Oracle hanno tutti gli esempi SQL con parole chiave (SELECT, FROM, WHERE, ecc.) Scritte in maiuscolo ma nomi di tabella e colonna in minuscolo.
J. Polfer,

Hmmm, è ancora vero per mysql? Pensavo di avere un'installazione predefinita di mysql ed è insensibile alle maiuscole / minuscole per i nomi delle colonne.
Kzqai,

22

Questo non è strettamente linguaggio SQL, ma in SQL Server se le regole di confronto del database fanno distinzione tra maiuscole e minuscole, tutti i nomi delle tabelle fanno distinzione tra maiuscole e minuscole.


16

In SQL Server è un'opzione . L'accensione fa schifo.

Non sono sicuro di MySql.


In MySql, la distinzione tra maiuscole e minuscole è un'opzione che puoi attivare e disattivare. Solo che l'insensibilità non funziona come si suppone che farebbe su Linux se il file system fa distinzione tra maiuscole e minuscole (impostazione predefinita). Devi creare un file system senza distinzione tra maiuscole e minuscole su Linux per far sì che mysql insensibilità alle maiuscole funzioni allo stesso modo di Windows (= correttamente). Soprattutto accenderlo / spegnerlo dopo alcuni lavori in un'altra modalità può avere conseguenze negative.
Stefan Steiger,

14

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


13

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.)


10

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.


5

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;

2
Nella maggior parte dei RDBMS, i nomi delle tabelle non fanno distinzione tra maiuscole e minuscole. Almeno non di default. MySQL è l'eccezione più importante a questa regola.

4

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.


2

Non credo che SQL Server faccia distinzione tra maiuscole e minuscole, almeno non per impostazione predefinita.

Quando eseguo una query manualmente tramite Management Studio, sbaglio continuamente il caso e lo accetta allegramente:

select cOL1, col2 FrOM taBLeName WheRE ...

2

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.


0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.