sql >> Databáze >  >> RDS >> Oracle

Maximální délka VARCHAR je 4000, ale lze uložit pouze 2666 bajtů dlouhý thajský text

Problém

Při popisu VARCHAR byste měli dodat jednotku, např. VARCHAR2(200 BYTE) nebo VARCHAR2(200 CHAR) . Pokud jednotku vynecháte, výchozí je BYTE (viz Koncepty databáze Oracle, kapitola Datové typy Oracle ). Zdá se, že jde o drobný detail, ale stává se poměrně závažným, když máte vícebajtové znakové sady.

Situace do 11 g

Bohužel existuje pevný limit na maximální velikost sloupce VARCHAR2. Je to 4000 BYTE (!) (viz Referenční příručka databáze Oracle, kapitola Datové typy Oracle ) až po Oracle 11g a . Toto je tvrdý limit a neexistuje způsob, jak to obejít. Jediný způsob, jak to obejít, je sloupec CLOB.

Řešení pro 12c

Na Oracle 12c je situace jiná. Zde můžete použít parametr MAX_STRING_SIZE = EXTENDED zvýšit limit až na 32 767 BYTE (viz Referenční jazyk databáze Oracle, kapitola Typy dat a Oracle Database Reference, kapitola Parametry inicializace ). Zřejmé řešení tedy zní:Upgradujte na Oracle 12c, nastavte MAX_STRING_SIZE = EXTENDED podle dokumentace a změňte definici tabulky. Při změně tabulky můžete ztratit některé indexy, protože dříve na 12c not indexy nemohly obsahovat hodnoty VARCHAR2 s více než 4000 BYTE a stále mohou existovat určitá omezení. (Musím zkontrolovat problém s indexy a zda jej lze opravit přebudováním indexů).

Řešení:Změňte kódování databáze

Můžete zkusit změnit kódování své nativní databáze (způsob, jakým vaše databáze mapuje znaky CHAR na BYTE). K tomu obvykle musíte vytvořit novou databázi a poskytnout vhodný parametr pro NLS_CHARACTERSET. Jedná se o velmi velkou změnu ve fungování databáze a může mít několik vedlejších účinků. Pokud se někdy pokusíte přidat znaky v jiném kódování, můžete mít smůlu (tj. nemůžete je uložit do databáze). Toto řešení bych tedy nenavrhoval.

Řešení:Přepněte na CLOB

Obvykle není nutné zadávat libovolné dotazy na tak velká textová pole. Můžete zkusit identifikovat dotazy, které vybírají ve velkém textovém sloupci, a migrovat je do Oracle Text na sloupci CLOB. Ale to je velmi velká změna a nemusí být možná s vaším stávajícím schématem nebo vaší aplikací. Můžete skončit se spoustou spouštěčů „MÍSTO“ a s některými chybějícími kontrolami omezení (včetně nově vytvořeného sloupce CLOB).

Řešení:Použijte XML

Místo CLOB můžete zkusit uložit svůj řetězec jako sloupec XML. Maximální velikost těchto zařízení je 4 GB. Poškodí to váš výkon, budete muset poskytovat MÍSTO spouštěčů a možná ztratíte některá omezení, ale mohlo by vám to fungovat.




  1. T-SQL:Jak vytvořím jedinečný klíč, který rozlišuje malá a velká písmena?

  2. Jak mohu shrnout data ve stromové struktuře v SQL od dětí po rodiče?

  3. převod dotazu MySQL na syntaxi Codeigniter

  4. Seskupený dotaz pro nalezení pouze jednoho záznamu (employee_id =1 nebo null)