Perché i nomi di tabella / colonna / indice Oracle sono limitati a 30 caratteri?


149

Posso capire che molti anni fa ci sarebbe questo tipo di limitazione, ma oggi sicuramente questo limite potrebbe essere facilmente aumentato. Abbiamo convenzioni di denominazione per gli oggetti, ma c'è sempre un caso che emerge quando raggiungiamo questo limite, specialmente nella denominazione di chiavi esterne.

Qualcuno sa davvero perché questa non è una dimensione più grande - o è più grande in 11g?


Apparentemente la risposta è che interromperà gli script attualmente non codificati in modo difensivo. Dico che è una cosa molto preoccupante, Oracle sta cercando di essere il database, sicuramente questo è il tipo di cosa che devi costantemente migliorare, altrimenti il ​​tuo prodotto morirà con la morte di mille tagli.

Ogni volta che vedo questo tipo di obiezione internamente, penso che sia ora di mordere il proiettile e risolverlo. Se le persone eseguono script che non controllano o mantengono quando aggiornano le versioni di Oracle, lascia che subiscano le conseguenze di quella scelta. Fornisci loro un flag di compatibilità, fino alla dimensione di 4000, quindi risparmiami il tempo sprecato quando creo oggetti di cui contare costantemente fino a 30 per verificare che il nome sia "OK".


3
Dal momento che deve esserci un limite? Rendi 64 caratteri e probabilmente troverai qualcuno che ti chiede perché non è 128 ecc. Quanto dura un pezzo di corda?
Il presidente

45
Vero, ma 30 è un pezzo di corda molto corto. Perché non può essere 4000 - le dimensioni di un Varchar2 - a Oracle importa davvero quanto tempo è passato una volta analizzata la query?
Chris Gill,

22
@TheChairman PostgreSQL mi limita a 63 caratteri e non ho mai avuto problemi con quel limite di lunghezza. È abbastanza grande che i miei nomi si adatteranno e se sto prendendo in considerazione un nome più lungo, è tempo di iniziare a pensare all'impatto negativo sulla leggibilità. D'altro canto, mi capita spesso di imbattermi in limiti di lunghezza dei nomi in Oracle e sono costretto a ridurre la leggibilità del mio nome a causa del limite di 30 caratteri. Alcune persone potrebbero lamentarsi di un limite di 64, ma molte persone hanno già problemi a causa del limite di 30 caratteri. Si tratta di soddisfare il 99% dei casi d'uso e Oracle non riesce qui.
jpmc26,

1
Dai, Oracle, sei diventato un dinosauro! Microsoft sta facendo un buon lavoro per rendere più amichevole il server SQL. Rilassa ora la limitazione della lunghezza del nome.
user3454439

1
Avanti veloce a Oracle 12cR2, ora è di 128 byte anziché 30 :-) docs.oracle.com/en/database/oracle/oracle-database/12.2/newft/…
Stefan L

Risposte:


71

Credo che sia lo standard ANSI.

MODIFICARE:

In realtà, penso che sia lo standard SQL-92.

Una versione successiva dello standard sembra consentire facoltativamente nomi di 128 caratteri, ma Oracle non lo supporta ancora (o ha un supporto parziale per esso, nella misura in cui consente 30 caratteri. Hmmm.)

Cerca "F391, identificatori lunghi" in questa pagina ... http://stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/ap_standard_sql001.htm

(Alla ricerca di un riferimento)


1
Hmm, non è così che ho letto quel documento. Mi dice che F391 è un elemento nelle specifiche SQL / Foundation (qualunque cosa sia) e che Oracle abbia un supporto parziale per esso, con un limite di 30 caratteri.
Skaffman,

21
Parzialmente conforme. Che scherzo. "le nostre viti sono parzialmente conformi agli standard metrici, tranne per il fatto che non sono metriche."
Jens Schauder,

5
Non ho letto le specifiche F391 in dettaglio, ma presumo (forse in modo errato) che "Identificatori lunghi" significhi un aumento della lunghezza dell'identificatore da 30 a 128. Quindi dire che si "parzialmente" supporta questo consentendo 30 caratteri un po 'sfacciato. Non supportate il nuovo standard, supportate comunque il vecchio standard (anche se il 25% del nuovo standard) aveva senso? !!?
cagcowboy,

7
Lo standard SQL-92 è qui contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt , ma se leggi la sezione "17.1 Descrizione delle aree descrittive degli elementi SQL" dice che identificatori come nomi e schemi devono consentire almeno 128 personaggi.
Rick,

46
Il fatto che i fan di Oracle non vedano l'utilità di oltre 30 identificatori di caratteri è inquietante. "Rendi i tuoi nomi significativi / descrittivi, usa caratteri di sottolineatura invece del caso del cammello e rimani sotto i 30 caratteri". Non supererebbe mai i 30 caratteri. Amirite? Più come abbreviare le tue abbreviazioni e quando nessuno dei nomi ha senso, passa tutto il giorno a leggere / aggiornare la documentazione.
Adam Jones,

45

Oltre al punto di cagcowboy che deriva dallo standard SQL (storicamente, sospetto che la decisione di Oracle abbia portato allo standard SQL poiché Oracle ha preceduto la standardizzazione di SQL), scommetterei che buona parte della riluttanza a consentire identificatori più lunghi proviene da la consapevolezza che ci sono milioni di DBA con milioni di script personalizzati che tutti presumono che gli identificatori siano lunghi 30 caratteri. Consentire ogni riga di codice simile a qualcosa

  l_table_name VARCHAR2(30);
BEGIN
  SELECT table_name
    INTO l_table_name
    FROM dba_tables
   WHERE ...

rompersi improvvisamente perché il DBA 15 anni fa usava VARCHAR2 (30) piuttosto che DBA_TABLES.TABLE_NAME%TYPEnella sceneggiatura avrebbe provocato un'enorme rivolta. Scommetto che solo Oracle ha migliaia di posti in cui questo genere di cose è stato fatto nel corso degli anni in vari pacchetti e componenti. Retrofitting tutto ciò che il codice per supportare identificatori più esistente sarebbe un progetto enorme che avrebbe quasi certamente generare modo più costi in tempo per gli sviluppatori, il tempo di QA, e gli insetti di nuova introduzione di quello che sarebbe generare benefici.


13
+1 Questo è quasi certamente uno dei molti storpi del design legacy di Oracle.
Skaffman,

43
Sicuramente è il momento di far crescere una coppia e aumentarla - aggiungi una bandiera in modo che gli amministratori di database possano perfezionarla fino a 30. Problemi come questo dovrebbero sempre essere confrontati e ordinati altrimenti finirai per paralizzare l'intera base di codice e le persone si sposteranno su qualcos'altro
Chris Gill,

6
Non solo milioni di righe di codice scritto DBA, ma senza dubbio anche un sacco di codice interno Oracle. Questo argomento è emerso in una sessione con Steven Feuerstein e ha detto che non pensava che l'avrebbero mai cambiato.
Matthew Watson,

10
Neanche loro potrebbero trombarlo esattamente come una nuova funzionalità ... passerebbero molto tempo ad estendere il limite, e quindi annunciano "ora puoi usare nomi più lunghi di 30 caratteri!". Sarebbero lo zimbello.
Skaffman,

9
Se stai ancora usando script di 15 anni, c'è qualcosa di estremamente sbagliato . Inoltre, risolverli sarebbe un costo una tantum (forse con un po 'di più per la manutenzione continua), mentre gli sviluppatori continueranno a perdere tempo a creare inutilmente nomi orribilmente abbreviati a tempo indeterminato. @skaffman Sono già una risata per non averlo riparato (e una miriade di altre decisioni progettuali che sono patetiche nell'era moderna, come nessun tipo booleano o auto-incrementante), per quanto mi riguarda.
jpmc26,

11

Stavo cercando questo e ho trovato questa domanda tramite Google, ma ho anche scoperto che a partire da Oracle 12c Release 2 (12.2), questo non è più rigorosamente il caso. ( https://oracle-base.com/articles/12c/long-identifiers-12cr2 )

Ad un certo punto ogni DBA o sviluppatore avrà raggiunto un punto in cui il limite di 30 caratteri per i nomi degli oggetti ha causato un problema. Questo limite può essere estremamente doloroso quando si eseguono progetti di migrazione da SQL Server o MySQL a Oracle. In Oracle Database 12cR2, la lunghezza massima della maggior parte degli identificatori è ora di 128 caratteri.

Questa è una nuova funzionalità in 12.2, secondo ( http://blog.dbi-services.com/oracle-12cr2-long-identifiers/ ). Secondo quel post, 12.1 era ancora limitato a 30 caratteri.


Modifica: ecco un link alla documentazione ufficiale di Oracle che spiega la modifica. ( https://docs.oracle.com/cloud/latest/exadataexpress-cloud/CSDBF/longer-identifier-names.htm#CSDBF-GUID-F4CA155F-5A37-4705-8443-0A8C9E3F875C )

A partire da Oracle Database 12c versione 2 (12.2), la lunghezza massima dei nomi identificativi per la maggior parte dei tipi di oggetti di database è stata aumentata a 128 byte.


128 byte / 4 byte (Unicode) = 32 caratteri. Almeno la mia comprensione è che 4 byte per i caratteri non Unicode non sono così rari? Mi chiedo se questo significhi semplicemente che stanno supportando Unicode ora? Proprio come VARCHAR2(2)non significa 2 caratteri ma 2 byte.
Seth,

1
Vedo il tuo punto, ma i caratteri rispetto ai byte dipendono dal set di caratteri del database. Tale impostazione determina la codifica per i tipi di dati char (come varchar2) e la codifica per gli identificatori db. Ciò è in contrasto con il set di caratteri nazionale, che viene utilizzato per i tipi di dati nchar. Quindi sì, se hai una codifica tale che i tuoi identificatori stanno usando 4 byte per carattere (supponendo che possano essere usati come set di caratteri DB), ora ne avresti 32 anziché 7. Ma penso che per la maggior parte dei casi gli identificatori sarebbero caratteri a byte singolo.
Kanmuri,

6

Data la necessità pratica dei limiti di lunghezza dell'identificatore, un buon design limita la lunghezza dei nomi effettivi per evitare di colpire il soffitto quando i nomi sono combinati tra loro e con prefissi e suffissi.

Ad esempio, una convenzione di denominazione dei vincoli di chiave esterna

FK_<table1>_<table2> 

limita i nomi delle tabelle a 13 caratteri o meno; la maggior parte dei database avrà bisogno di più prefissi e suffissi, limitando ulteriormente la lunghezza dei nomi delle tabelle.


5

Le violazioni dei vincoli vengono segnalate in SQLERRM che è limitato a 255 caratteri e che la maggior parte dei client utilizza per rendere visibili gli errori. Ho il sospetto che aumentare in modo significativo la dimensione consentita dei nomi dei vincoli avrebbe un impatto sulla capacità di riferire sulle violazioni (specialmente laddove una violazione del vincolo sia stata gorgogliata attraverso alcuni strati di codice PL / SQL).


Allora, allora allarga quel tavolo?
Skaffman,

2
Non è una tabella, ma il modo in cui il software client ottiene effettivamente errori dal database.
Gary Myers,

La lunghezza di SQLERRM di @skaffman è una specifica API / ABI. Cambiare questo significherebbe dover patchare ogni driver OCI sul pianeta (altrimenti sovraccarico del buffer). Potrebbero assegnare la modifica al client per aumentare prima il buflen in OCI 13 e il server in qualcosa come Oracle 15, dove i client OCI 10 non sarebbero più supportati, suppongo. (Forse lo stanno anche prendendo in considerazione ora, ma Oracle rilascia la versione principale solo ogni pochi anni; e quindi potremmo ancora incorrere in problemi di aggiornamento di script / applicazioni quando le app vengono migrate su server / client diversi).
Cowbert,

4

Credo che la lunghezza dell'identificatore di 30 caratteri provenga da COBOL, che è stato standardizzato alla fine degli anni '50. Poiché i programmi COBOL erano l'utente principale di SQL (e SEQUEL prima (e QUEL prima)), questo doveva sembrare un numero ragionevole per la lunghezza dell'identificatore.


5
Credo che la prima versione di Oracle sia stata scritta in Fortran, che credo abbia un limite di lunghezza identificativo di 31. Forse è rilevante.
David Aldridge,

4

Tutti questi "vincoli" sono lasciati alle risposte alle limitazioni imposte dalle architetture dei processori che provengono dagli anni '70. Da quel momento i processori a tempo si sono evoluti al punto che tali limiti non sono più necessari; sono appena rimasti. Tuttavia, cambiarli è un GRANDE affare per gli scrittori del RDBMS. Poiché questi limiti di lunghezza influiscono su tutto ciò che si trova a valle cambiandolo volenti o nolli per adattarsi, si può dire che un nome di procedura più lungo può e probabilmente romperà molte altre cose come la segnalazione di esecuzioni, il dizionario dei dati, ecc. E così via. Richiederei un'importante riscrittura di Oracle RDBMS.


2

La risposta diretta alla domanda è che lo stile Oracle è ereditato da idee precedenti in cui 30 sembravano molto, e molto di più avrebbe aumentato il rischio di sbloccare la cache del dizionario dalla memoria reale nei database tipici.

Al contrario, lo spazio dei nomi ODBC proviene da una posizione molto diversa, in cui i set di dati vengono estratti rapidamente analizzando una tabella in un foglio Excel e costruendo automaticamente tabelle di database con nomi di colonne presi dalle intestazioni delle tabelle dei fogli. Pensare in questo modo ti porta a consentire identificatori che contengono persino ritorni a capo incorporati e, naturalmente, caratteri speciali e maiuscole / minuscole. È un'astrazione ragionevole perché modella il modo in cui pensano gli analisti di dati di oggi.

Non importa SQL92, è la conformità ODBC che conta davvero per il database universale di oggi e altri fornitori lo hanno affrontato meglio di Oracle. Anche Teradata, ad esempio, che non viene visto da molti come un giocatore pervasivo, si rivolge a DUE spazi dei nomi, con e senza virgolette, il primo con un limite di 30 caratteri, il secondo un'implementazione ODBC completa in cui vengono presi in considerazione strani identificatori lunghi .

Anche nella tradizionale arena di database di grandi dimensioni, 30 caratteri sono spesso un problema in cui i nomi devono rimanere significativi, coerenti e memorabili. Una volta che inizi a progettare strutture specializzate con eredità con nome di ruolo, inizierai ad abbreviare le abbreviazioni e presto la coerenza muore, perché ad esempio lo stesso identificatore di radice reso come un nome di tabella o un nome di colonna avrà bisogno in un caso di ulteriori abbreviazioni e nell'altro no . Se gli utenti reali in numero significativo vengono invitati a tali livelli, le conseguenze sono un'usabilità molto scarsa e fortunatamente per qualsiasi database obsoleto, l'unità principale ora è quella di separare l'utente dal database tramite livelli oggetto e strumenti di BI.

Questo lascia il livello del database al DBA e ai team di architetto dei dati, che forse non sono infastiditi. Sembra che elaborare schemi di abbreviazioni sia ancora un lavoro per tutta la vita.

Il fatto che Oracle non abbia affrontato questa vecchia limitazione forse riflette principalmente sul fatto che non sta (ancora) perdendo molto business rispetto alla concorrenza quando non è in grado di trasferire direttamente i progetti di database creati utilizzando identificatori più lunghi.


Non per Oracle. ODBC è un bambino Microsoft, non Java. È ancora una libreria di supporto separata collegata a OCI (guarda come viene distribuito il client istantaneo - per far funzionare ODBC con il client istantaneo hai bisogno sia del driver OCI sia delle zip del client istantaneo ODBC). La piattaforma client principale di Oracle (oltre a Pro * C / C / C ++ legacy) è JDBC, che è direttamente collegata a OCI, non ODBC.
Cowbert,

1

Tutti i commenti sopra sono giusti, MA è necessario tenere presente il costo delle prestazioni di nomi più lunghi. All'inizio degli anni '90, quando Informix istituì un enorme cartellone pubblicitario "Informix Faster Than Oracle!" sulla route 101 vicino al quartier generale di Oracle, Informix consentiva nomi di tabelle più brevi di 18 caratteri! Il motivo è ovvio: i nomi delle tabelle nella loro forma letterale (ovvero come nomi effettivi anziché "t138577321" o qualcosa del genere) sono memorizzati nel dizionario dei dati. I nomi più lunghi equivalgono a Dizionario dei dati più grande e, poiché il Dizionario dei dati viene letto ogni volta che una query richiede un'analisi approfondita, un dizionario dei dati più grande equivale a prestazioni scarse ...


7
Non c'è assolutamente alcun motivo per cui la corrispondenza esatta delle stringhe brevi costituisca un collo di bottiglia in qualsiasi software moderno a meno che non lo si faccia miliardi di volte, il che non è il caso dell'analisi delle query. Le considerazioni sulle prestazioni in termini di dimensioni potrebbero essere state significative al momento della progettazione di questa parte di Oracle, ma oggigiorno non sono rilevanti.
Sarah G,

-7

ok, la limitazione esiste ....

ma hai davvero bisogno di più di 30 caratteri per nominare una tabella / indice / colonna ??

quando scrivo query, con questa limitazione trovo ANCORA fastidiosi alcuni nomi di colonne / tabelle. Se il limite fosse maggiore, potrei imbattermi in tabelle che richiedono una query come:

select unique_identifier_column, 
time_when_the_user_remembered_to_change_the_row_in_the_receipt_table, 
foreign_key_to_the_ap_invoice_distributions_history_table_related_to_the_all_rows_table 
from ap_invoices_really_really_all_all_rows_present_in_this_ebs_table.

Mi scuso per le enormi parole: P


29
Sarebbe bello poter nominare le chiavi esterne con i nomi di entrambe le tabelle e le colonne alle quali si uniscono, pertanto quando viene generata un'eccezione di chiave esterna non è necessario cercare le colonne che hanno causato l'errore. Poi di nuovo Oracle potrebbe dirti quell'informazione ...
Chris Gill,

10
Ci sono molte ragioni per cui abbiamo bisogno di più di 30 caratteri, sebbene di solito siano sufficienti 30 caratteri. A volte il nome di una tabella deve essere abbastanza dettagliato per essere significativo. Ad esempio, ho questa tabella chiamata sch_PatternRunTimeException, è lunga esattamente 30 caratteri. Ora, devo aggiungere una tabella di mirroring chiamata sch_DevPatternRunTimeException. Questo standard di denominazione aggiuntivo di 3 caratteri non funziona per Oracle, MSSQL non ha alcun problema. Questo mi sta costringendo a trovare un nuovo nome. La ridenominazione della tabella è fattibile, ma influirà sulle operazioni dei nostri clienti, che cerchiamo di evitare.
dsum

6
Se nel 99,9% dei casi possibili +30 caratteri sono fastidiosi , non significa che sarebbero utili l'altro 0,1%.
René Nyffenegger,

14
Ahhh l'argomento pendio scivoloso. Un limite di soli 4 caratteri alfanumerici ci porterebbe oltre 1 milione di combinazioni di tabelle, quindi nessuno "ha bisogno" di più di 4. Eppure eccoci qui. E non sono in realtà 30 caratteri, sono meno di 30 caratteri poiché la mia convenzione di denominazione dei casi Pascal deve essere scaricata con la mancanza di distinzione tra maiuscole e minuscole e sostituita con caratteri delimitati da sottolineatura. Combina questo con vari prefissi / suffissi e sei fortunato ad avere anche 20 caratteri. Chi non preferirebbe che un nome di indice robusto risuonasse di un errore di violazione su un miscuglio di abbreviazioni e caratteri di sottolineatura?
b_levitt,

D'accordo, questo non affronta il problema. Normalmente gli esseri umani non hanno bisogno di nomi di colonne più lunghi, ma ci sono molti casi in cui i nomi degli oggetti vengono generati automaticamente.
fool4jesus,
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.