Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Die maximale Länge von VARCHAR beträgt 4000, aber es kann nur 2666 Byte langer thailändischer Text gespeichert werden

Das Problem

Bei der Beschreibung eines VARCHAR sollten Sie eine Einheit angeben, z. VARCHAR2(200 BYTE) oder VARCHAR2(200 CHAR) . Wenn Sie die Einheit weglassen, ist die Voreinstellung BYTE (siehe Oracle-Datenbankkonzepte, Kapitel Oracle-Datentypen ). Dies scheint ein kleines Detail zu sein, wird aber ziemlich schwerwiegend, wenn Sie Multi-Byte-Zeichensätze haben.

Situation bis 11g

Leider gibt es eine feste Grenze für die maximale Größe einer VARCHAR2-Spalte. Es sind 4000 BYTEs (!) (siehe Oracle Database Reference, Kapitel Oracle-Datentypen ) bis Oracle 11g und . Dies ist eine harte Grenze und es führt kein Weg daran vorbei. Der einzige Weg, dies zu umgehen, ist eine CLOB-Spalte.

Lösung für 12c

Anders sieht es bei Oracle 12c aus. Dort können Sie den Parameter MAX_STRING_SIZE = EXTENDED verwenden um das Limit auf 32767 BYTE anzuheben (siehe Oracle Database Language Reference, Kapitel Datentypen und Oracle Database Reference, Kapitel Initialisierungsparameter ). Die offensichtliche Lösung ist also:Upgrade auf Oracle 12c, setze MAX_STRING_SIZE = EXTENDED gemäß der Dokumentation und ändern Sie Ihre Tabellendefinition. Sie könnten einige Indizes verlieren, wenn Sie Ihre Tabelle ändern, da vor 12c Not-Indizes keine VARCHAR2-Werte mit mehr als 4000 BYTEs enthalten konnten und es möglicherweise immer noch einige Einschränkungen gibt. (Ich muss das Problem mit den Indizes überprüfen und ob es behoben werden kann, indem ich die Indizes neu aufbaue).

Lösung:Datenbankkodierung ändern

Sie könnten versuchen, Ihre native Datenbankcodierung zu ändern (die Art und Weise, wie Ihre Datenbank CHARs auf BYTEs abbildet). Dazu müssen Sie in der Regel eine neue Datenbank erstellen und einen entsprechenden Parameter für NLS_CHARACTERSET bereitstellen. Dies ist eine sehr große Änderung in der Funktionsweise Ihrer Datenbank und kann mehrere Nebeneffekte haben. Wenn Sie jemals versuchen, Zeichen in einer anderen Codierung hinzuzufügen, haben Sie möglicherweise Pech (d. h. Sie können sie nicht in Ihrer Datenbank speichern). Daher würde ich diese Lösung nicht vorschlagen.

Lösung:Wechseln Sie zu CLOB

Normalerweise ist es nicht notwendig, beliebige Abfragen auf solch große Textfelder zu stellen. Sie können versuchen, die Abfragen zu identifizieren, indem Sie in der großen Textspalte auswählen, und sie zu Oracle Text migrieren auf einer CLOB-Spalte. Dies ist jedoch eine sehr große Änderung und mit Ihrem vorhandenen Schema oder Ihrer Anwendung möglicherweise nicht möglich. Sie könnten am Ende mit einer Reihe von "INSTEAD OF"-Triggern und mit einigen fehlenden Constraint-Prüfungen (unter Einbeziehung der neu erstellten CLOB-Spalte) enden.

Lösung:Verwenden Sie XML

Anstelle eines CLOBs könnten Sie versuchen, Ihren String als XML-Spalte zu speichern. Die maximale Größe für diese beträgt 4 GB. Es wird Ihrer Leistung schaden, Sie müssen STATT Auslöser bereitstellen und verlieren möglicherweise einige Einschränkungen, aber es könnte für Sie funktionieren.