Warum sind Oracle-Tabellen- / Spalten- / Indexnamen auf 30 Zeichen beschränkt?


149

Ich kann verstehen, dass es vor vielen Jahren diese Art von Einschränkung geben würde, aber heutzutage könnte diese Grenze sicherlich leicht erhöht werden. Wir haben Namenskonventionen für Objekte, aber es gibt immer einen Fall, in dem wir diese Grenze erreichen - insbesondere beim Benennen von Fremdschlüsseln.

Weiß jemand wirklich, warum dies keine größere Größe ist - oder ist es in 11 g größer?


Anscheinend ist die Antwort, dass es aktuelle Skripte kaputt macht, die nicht defensiv codiert sind. Ich sage, das ist eine sehr besorgniserregende Sache. Oracle versucht, die Datenbank zu sein. Dies ist sicherlich die Art von Dingen, die Sie ständig verbessern müssen, sonst stirbt Ihr Produkt nach tausend Schnitten.

Immer wenn ich diese Art von Einspruch im Haus sehe, denke ich, ist es Zeit, die Kugel zu beißen und sie zu klären. Wenn Benutzer Skripts ausführen, die sie beim Upgrade von Oracle-Versionen nicht überprüfen oder warten, lassen Sie sie unter den Folgen dieser Auswahl leiden. Geben Sie ihnen ein Kompatibilitätsflag mit einer Größe von bis zu 4000 und sparen Sie mir dann die verschwendete Zeit, wenn ich Objekte erstelle, die ständig bis 30 zählen müssen, um zu überprüfen, ob der Name "OK" ist.


3
Da muss es ein Limit geben? Machen Sie es 64 Zeichen und Sie werden wahrscheinlich jemanden finden, der fragt, warum es nicht 128 usw. ist. Wie lang ist ein Stück Schnur?
Der Vorsitzende

45
Stimmt, aber 30 ist ein sehr kurzes Stück Schnur. Warum kann es nicht 4000 sein - die Größe eines Varchar2 - kümmert es Oracle wirklich, wie lange es dauert, wenn es die Abfrage analysiert hat?
Chris Gill

22
@TheChairman PostgreSQL beschränkt mich auf 63 Zeichen, und ich hatte nie ein Problem mit dieser Längenbeschränkung. Es ist groß genug, damit meine Namen passen, und wenn ich über einen längeren Namen nachdenke, ist es Zeit, über die negativen Auswirkungen auf die Lesbarkeit nachzudenken. Auf der anderen Seite stoße ich in Oracle häufig auf Namenslängenbeschränkungen und bin aufgrund der Beschränkung auf 30 Zeichen gezwungen, die Lesbarkeit meines Namens zu verringern . Einige Leute beschweren sich vielleicht über ein Limit von 64, aber viele Leute haben bereits Probleme wegen des Limits von 30 Zeichen. Es geht darum, 99% der Anwendungsfälle zu erfüllen, und Oracle schlägt hier fehl.
jpmc26

1
Komm schon, Oracle, du bist ein Dinosaurier geworden! Microsoft leistet gute Arbeit, um SQL Server benutzerfreundlicher zu machen. Lockern Sie nun die Namenslängenbeschränkung.
user3454439

1
Schneller Vorlauf zu Oracle 12cR2, jetzt sind es 128 Bytes statt 30 :-) docs.oracle.com/de/database/oracle/oracle-database/12.2/newft/…
Stefan L

Antworten:


71

Ich glaube, es ist der ANSI-Standard.

BEARBEITEN:

Eigentlich denke ich, dass es der SQL-92-Standard ist.

Eine spätere Version des Standards scheint optional 128 Zeichennamen zuzulassen, aber Oracle unterstützt dies noch nicht (oder unterstützt dies teilweise, sofern 30 Zeichen zulässig sind. Hmmm.)

Suchen Sie auf dieser Seite nach "F391, Long Identifiers" ... http://stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/ap_standard_sql001.htm

(Auf der Suche nach einem Schiedsrichter)


1
Hmm, so habe ich das Dokument nicht gelesen. Es sagt mir, dass F391 ein Element in der SQL / Foundation-Spezifikation ist (was auch immer das ist) und dass Oracle dies teilweise unterstützt, mit einer Beschränkung auf 30 Zeichen.
Skaffman

21
Teilweise Einhaltung. Was für ein Witz. "Unsere Schrauben entsprechen teilweise den metrischen Standards, außer sie sind nicht metrisch."
Jens Schauder

5
Ich habe die F391-Spezifikation nicht im Detail gelesen, aber ich gehe (möglicherweise fälschlicherweise) davon aus, dass "Lange Bezeichner" eine Erhöhung der Bezeichnerlänge von 30 auf 128 bedeutet. Wenn Sie also "teilweise" dies unterstützen, indem Sie 30 Zeichen zulassen, ist dies der Fall ein bisschen frech. Sie unterstützen den neuen Standard nicht, Sie unterstützen immer noch den alten Standard (obwohl 25% des Weges zum neuen Standard). Hat das Sinn gemacht? !!?
Cagcowboy

7
Der SQL-92-Standard lautet hier contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt . Wenn Sie jedoch Abschnitt "17.1 Beschreibung der SQL- Elementdeskriptorbereiche " lesen, heißt es, dass Bezeichner wie Namen und Schemas mindestens 128 zulassen müssen Zeichen.
Rick

46
Die Tatsache, dass Oracle-Fanboys die Nützlichkeit von mehr als 30 Zeichen nicht erkennen, ist beunruhigend. "Machen Sie Ihre Namen aussagekräftig / beschreibend, verwenden Sie Unterstriche anstelle von Kamelbuchstaben und bleiben Sie unter 30 Zeichen". Das würde niemals über 30 Zeichen gehen. Amirite? Eher wie Abkürzungen für Ihre Abkürzungen und wenn keiner der Namen Sinn macht, verbringen Sie den ganzen Tag damit, die Dokumentation zu lesen / zu aktualisieren.
Adam Jones

45

Zusätzlich zu Cagcowboys Argument, dass es vom SQL-Standard abgeleitet ist (historisch gesehen vermute ich, dass die Entscheidung von Oracle zum SQL-Standard führte, da Oracle vor der Standardisierung von SQL existierte), würde ich wetten, dass ein großer Teil der Zurückhaltung, längere Bezeichner zuzulassen, von dort herrührt die Erkenntnis, dass es Millionen von Datenbankadministratoren mit Millionen von benutzerdefinierten Skripten gibt, die alle davon ausgehen, dass Bezeichner 30 Zeichen lang sind. Erlaubt jede Codezeile, die so etwas wie geht

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

plötzlich zu brechen, weil der DBA vor 15 Jahren VARCHAR2 (30) anstelle DBA_TABLES.TABLE_NAME%TYPEdes Skripts verwendete, würde einen massiven Aufstand auslösen. Ich würde wetten, dass Oracle allein Tausende von Orten hat, an denen solche Dinge im Laufe der Jahre in verschiedenen Paketen und Komponenten durchgeführt wurden. Nachrüsten alle , dass Code bestehende mehr Kennungen zu unterstützen wäre ein enormes Projekt, das mit ziemlicher Sicherheit erzeugen würde Art und Weise mehr Kosten in Entwicklungszeit, QA Zeit, und neu eingeführte Fehler , als es Nutzen erzielen würde.


13
+1 Dies ist mit ziemlicher Sicherheit einer der vielen älteren Design-Krüppel von Oracle.
Skaffman

43
Sicherlich ist es an der Zeit, ein Paar zu vergrößern und zu vergrößern - fügen Sie ein Flag hinzu, damit DBAs es wieder auf 30 verfeinern können. Legacy-Probleme wie dieses sollten immer konfrontiert und sortiert werden, da sonst die gesamte Codebasis verkrüppelt wird und die Leute sich einfach bewegen auf etwas anderes
Chris Gill

6
Nicht nur Millionen von Zeilen DBA-Code, sondern zweifellos auch viel interner Oracle-Code. Dieses Thema wurde in einer Sitzung mit Steven Feuerstein angesprochen und er sagte, er hätte nicht gedacht, dass sie es jemals ändern würden.
Matthew Watson

10
Sie konnten es auch nicht genau als neues Feature trompeten ... sie verbrachten viel Zeit damit, das Limit zu verlängern, und kündigten dann an, "Sie können jetzt Namen verwenden, die länger als 30 Zeichen sind!". Sie wären das Gespött.
Skaffman

9
Wenn Sie immer noch 15 Jahre alte Skripte verwenden, stimmt etwas nicht . Außerdem wäre das Reparieren einmalig (möglicherweise mit etwas mehr für die fortgesetzte Wartung), während Entwickler weiterhin Zeit damit verschwenden, unnötig schrecklich abgekürzte Namen auf unbestimmte Zeit zu erstellen. @skaffman Sie sind bereits ein Gespött dafür, dass sie es nicht repariert haben (und eine Vielzahl anderer Designentscheidungen, die in der modernen Zeit erbärmlich sind, wie keine booleschen oder automatisch inkrementierenden Typen), soweit es mich betrifft.
jpmc26

11

Ich habe dies nachgeschlagen und diese Frage über Google gefunden, aber auch herausgefunden, dass dies ab Oracle 12c Release 2 (12.2) nicht mehr unbedingt der Fall ist. ( https://oracle-base.com/articles/12c/long-identifiers-12cr2 )

Irgendwann hat jeder DBA oder Entwickler einen Punkt erreicht, an dem die Beschränkung auf 30 Zeichen für Objektnamen ein Problem verursacht hat. Diese Begrenzung kann bei Migrationsprojekten von SQL Server oder MySQL zu Oracle äußerst schmerzhaft sein. In Oracle Database 12cR2 beträgt die maximale Länge der meisten Bezeichner jetzt 128 Zeichen.

Dies ist laut ( http://blog.dbi-services.com/oracle-12cr2-long-identifiers/ ) eine neue Funktion in 12.2 . Laut diesem Beitrag war 12.1 immer noch auf 30 Zeichen beschränkt.


Bearbeiten: Hier ist ein Link zur offiziellen Oracle-Dokumentation, in der die Änderung erläutert wird. ( https://docs.oracle.com/cloud/latest/exadataexpress-cloud/CSDBF/longer-identifier-names.htm#CSDBF-GUID-F4CA155F-5A37-4705-8443-0A8C9E3F875C )

Ab Oracle Database 12c Release 2 (12.2) wurde die maximale Länge der Bezeichnernamen für die meisten Arten von Datenbankobjekten auf 128 Byte erhöht.


128 Bytes / 4 Bytes (Unicode) = 32 Zeichen. Zumindest verstehe ich, dass 4 Bytes für Nicht-Unicode-Zeichen nicht ungewöhnlich sind? Ich muss mich fragen, ob das nur bedeutet, dass sie jetzt Unicode unterstützen. Genau wie VARCHAR2(2)bedeutet nicht 2 Zeichen, sondern 2 Byte.
Seth

1
Ich verstehe Ihren Standpunkt, aber die Zeichen gegen Bytes hängen von Ihrem Datenbankzeichensatz ab. Diese Einstellung bestimmt die Codierung für die char-Datentypen (z. B. varchar2) sowie die Codierung für Datenbankkennungen. Dies steht im Gegensatz zum nationalen Zeichensatz, der für nchar-Datentypen verwendet wird. Also ja, wenn Sie eine Codierung haben, bei der Ihre Bezeichner 4 Bytes pro Zeichen verwenden (vorausgesetzt, diese können als DB-Zeichensatz verwendet werden), hätten Sie jetzt 32 statt 7. Aber ich denke, für die meisten Anwendungsfälle wären dies Bezeichner Einzelbytezeichen.
Kanmuri

6

Angesichts der praktischen Notwendigkeit von Längenbeschränkungen für Bezeichner beschränkt ein gutes Design die Länge der tatsächlichen Namen, um zu vermeiden, dass die Obergrenze erreicht wird, wenn die Namen miteinander und mit Präfixen und Suffixen kombiniert werden.

Zum Beispiel eine Konvention zum Benennen von Fremdschlüsseleinschränkungen

FK_<table1>_<table2> 

begrenzt Tabellennamen auf 13 Zeichen oder weniger; Die meisten Datenbanken benötigen mehr Präfixe und Suffixe, wodurch die Länge der Tabellennamen weiter eingeschränkt wird.


5

Verstöße gegen Einschränkungen werden in SQLERRM gemeldet, das auf 255 Zeichen begrenzt ist und von den meisten Clients verwendet wird, um Fehler sichtbar zu machen. Ich vermute, dass eine Erhöhung der zulässigen Größe von Einschränkungsnamen die Fähigkeit zur Meldung von Verstößen erheblich beeinträchtigen würde (insbesondere, wenn eine Einschränkungsverletzung durch einige Ebenen von PL / SQL-Code gesprudelt wurde).


Also, ähm, machen Sie diesen Tisch dann breiter?
Skaffman

2
Es ist keine Tabelle, sondern wie Client-Software tatsächlich Fehler aus der Datenbank erhält.
Gary Myers

@skaffman SQLERRM-Länge ist eine API / ABI-Spezifikation. Dies zu ändern würde bedeuten, dass jeder OCI-Treiber auf dem Planeten gepatcht werden muss (sonst Pufferüberlauf). Sie könnten die Änderung auf den Client übertragen, um zuerst die Puffer in OCI 13 und den Server in Oracle 15 zu erhöhen, wo OCI 10-Clients vermutlich nicht mehr unterstützt werden. (Vielleicht ziehen sie es jetzt sogar in Betracht, aber die Hauptversion von Oracle wird nur alle paar Jahre veröffentlicht. Wenn Apps auf einen anderen Server / Client migriert werden, kann es dennoch zu Problemen bei der Aktualisierung von Skripten / Anwendungen kommen.)
Cowbert

4

Ich glaube, dass die Länge von 30 Zeichen von COBOL stammt, das Ende der 1950er Jahre standardisiert wurde. Da COBOL-Programme der Hauptbenutzer von SQL waren (und SEQUEL davor (und QUEL davor)), muss dies eine vernünftige Zahl für die Bezeichnerlänge gewesen sein.


5
Ich glaube, die erste Version von Oracle wurde in Fortran geschrieben, das meiner Meinung nach eine maximale Länge für Bezeichner von 31 hat. Vielleicht ist das relevant.
David Aldridge

4

All diese "Einschränkungen" bleiben den Reaktionen auf Einschränkungen überlassen, die durch Prozessorarchitekturen aus den 70er Jahren auferlegt wurden. Seitdem haben sich Prozessoren so weit entwickelt, dass diese Einschränkungen nicht mehr erforderlich sind. sie sind nur übrig geblieben. Ihre Änderung ist jedoch für die Verfasser des RDBMS ein GROSSES Geschäft. Da diese Längenbeschränkungen alles beeinflussen, was sich stromabwärts ändert, ist es wohl oder übel, wenn man sagt, dass ein längerer Prozedurname viele andere Dinge wie Ausnahmeberichte, das Datenwörterbuch usw. usw. beschädigen kann und wird. Ich würde ein umfangreiches Umschreiben des Oracle RDBMS erfordern.


2

Die direkte Antwort auf die Frage lautet, dass der Oracle-Stil von älteren Ideen geerbt wurde, bei denen 30 viel zu sein schien, und viel mehr das Risiko erhöht hätte, den Wörterbuch-Cache in typischen Datenbanken aus dem realen Speicher zu entfernen.

Im Gegensatz dazu stammt der ODBC-Namespace von einem ganz anderen Ort, an dem Datensätze schnell extrahiert werden, indem eine Tabelle in einer Excel-Tabelle analysiert und automatisch Datenbanktabellen mit Spaltennamen aus Blatttabellenüberschriften erstellt werden. Wenn Sie so denken, können Sie Bezeichner zulassen, die sogar eingebettete Zeilenumbrüche enthalten, und natürlich Sonderzeichen und Groß- und Kleinschreibung. Es ist eine vernünftige Abstraktion, weil sie das Denken heutiger Datenanalysten modelliert.

Egal, SQL92, es ist die ODBC-Konformität, die für die heutige universelle Datenbank wirklich wichtig ist, und andere Anbieter haben dies besser angegangen als Oracle. Sogar Teradata zum Beispiel, das von vielen nicht als allgegenwärtiger Spieler angesehen wird, bietet ZWEI Namespaces mit und ohne Anführungszeichen, ersteres mit einem Limit von 30 Zeichen, letzteres eine vollständige ODBC-Implementierung, bei der seltsame lange Bezeichner berücksichtigt werden .

Selbst in der traditionellen Arena mit großen Datenbanken sind 30 Zeichen oft ein Problem, bei dem Namen aussagekräftig, konsistent und einprägsam bleiben sollen. Sobald Sie anfangen, spezialisierte Strukturen mit Verben mit Rollennamen zu entwerfen, beginnen Sie mit der Abkürzung von Abkürzungen, und die Konsistenz stirbt bald, da beispielsweise dieselbe Stammkennung, die als Tabellenname oder Spaltenname gerendert wird, in einem Fall eine weitere Abkürzung benötigt und in dem anderen nicht . Wenn echte Benutzer in erheblicher Anzahl zu solchen Ebenen eingeladen werden, sind die Folgen eine sehr schlechte Benutzerfreundlichkeit. Glücklicherweise besteht das Hauptantrieb für eine alternde Datenbank darin, Benutzer über Objektebenen und BI-Tools von der Datenbank zu trennen.

Dies überlässt die Datenbankschicht dem DBA und den Datenarchitektenteams, die vielleicht nicht so gestört sind. Die Ausarbeitung von Abkürzungsschemata scheint immer noch eine Aufgabe fürs Leben zu sein.

Dass Oracle diese alte Einschränkung nicht angesprochen hat, spiegelt möglicherweise hauptsächlich die Tatsache wider, dass es (noch) nicht viel Geschäft an seine Konkurrenz verliert, wenn es Datenbankdesigns, die mit längeren Bezeichnern erstellt wurden, nicht direkt portieren kann.


Nicht zu Oracle. ODBC ist ein Microsoft-Baby, kein Java-Baby. Es ist immer noch eine separate Hilfsbibliothek, die mit OCI verknüpft ist (sehen Sie sich an, wie Instantclient bereitgestellt wird - damit ODBC mit Instantclient funktioniert, benötigen Sie sowohl den OCI-Treiber als auch die ODBC-Instantclient-Zips). Die primäre Client-Plattform von Oracle (neben Pro * C / C / C ++) ist JDBC, das direkt mit OCI und nicht mit ODBC verbunden ist.
Cowbert

1

Alle obigen Kommentare sind richtig, ABER Sie müssen die Leistungskosten längerer Namen berücksichtigen. In den frühen 90er Jahren, als Informix eine riesige Werbetafel "Informix schneller als Oracle!" Auf der Route 101 neben dem Oracle-Hauptsitz erlaubte Informix Tabellennamen, die nur kürzer als 18 Zeichen waren! Der Grund liegt auf der Hand: Tabellennamen in ihrer wörtlichen Form (dh als tatsächliche Namen anstelle von 't138577321' oder so ähnlich) werden im Datenwörterbuch gespeichert. Längere Namen entsprechen einem größeren Datenwörterbuch. Da das Datenwörterbuch jedes Mal gelesen wird, wenn eine Abfrage eine harte Analyse erfordert, bedeutet ein größeres Datenwörterbuch eine schlechte Leistung ...


7
Es gibt absolut keinen Grund dafür, dass die genaue Zuordnung von kurzen Zeichenfolgen ein Engpass in einer modernen Software ist, es sei denn, Sie tun dies milliardenfach - was beim Parsen von Abfragen nicht der Fall ist. Überlegungen zur Größe und Leistung waren möglicherweise von Bedeutung, als dieser Teil von Oracle zum ersten Mal entwickelt wurde, aber sie sind heutzutage nicht wirklich relevant.
Sarah G

-7

ok, die Einschränkung besteht ....

Aber BRAUCHEN Sie wirklich mehr als 30 Zeichen, um eine Tabelle / einen Index / eine Spalte zu benennen?

Wenn ich Abfragen schreibe, finde ich mit dieser Einschränkung immer noch einige Spalten- / Tabellennamen ärgerlich. Wenn das Limit höher wäre, könnte ich auf Tabellen stoßen, die eine Abfrage erfordern wie:

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.

Ich entschuldige mich für die großen Worte: P.


29
Es wäre schön, Fremdschlüssel mit den Namen der Tabellen und Spalten zu benennen, denen sie beitreten. Wenn also eine Fremdschlüsselausnahme ausgelöst wird, müssen Sie nicht nach den Spalten suchen, die den Fehler verursacht haben.
Chris Gill

10
Es gibt viele Gründe, warum wir mehr als 30 Zeichen benötigen, obwohl normalerweise 30 Zeichen ausreichen. Manchmal muss ein Tabellenname ausführlich genug sein, um aussagekräftig zu sein. Ich habe zum Beispiel diesen Tabellenaufruf sch_PatternRunTimeException, er ist genau 30 Zeichen lang. Jetzt muss ich einen Spiegelungstabellenaufruf sch_DevPatternRunTimeException hinzufügen. Dieser zusätzliche Namensstandard für 3 Zeichen funktioniert nicht für Oracle, MSSQL hat kein Problem. Das zwingt mich, einen neuen Namen zu finden. Das Umbenennen von Tabellen ist machbar, wirkt sich jedoch auf die Abläufe unserer Kunden aus, die wir zu vermeiden versuchen.
dsum

6
Wenn in 99,9% der möglichen Fälle +30 Zeichen ärgerlich sind, heißt das nicht, dass sie sich für die anderen 0,1% als nützlich erweisen würden.
René Nyffenegger

14
Ahhh das schlüpfrige Hangargument. Ein Limit von nur 4 alphanumerischen Zeichen würde uns über 1 Million Tabellenkombinationen bringen, sodass niemand wirklich mehr als 4 "braucht". Doch hier sind wir. Und es sind nicht wirklich 30 Zeichen, es sind weniger als 30 Zeichen, da meine Pascal-Konvention zur Benennung von Groß- und Kleinschreibung aufgrund mangelnder Groß- und Kleinschreibung ignoriert und durch durch Unterstriche getrennte Namen ersetzt werden muss. Kombinieren Sie das mit verschiedenen Präfixen / Suffixen und Sie haben das Glück, sogar 20 Zeichen zu haben. Wer würde nicht lieber einen robusten Indexnamen mit einem Verstoßfehler über eine Vielzahl von Abkürzungen und Unterstrichen wiederholen?
b_levitt

Einverstanden, dass dies das Problem nicht angeht. Normalerweise benötigen Menschen keine längeren Spaltennamen, aber es gibt viele Fälle, in denen Objektnamen automatisch generiert werden.
narr4jesus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.