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

sémantika CHAR a ORA-01461

To pravděpodobně není něco, co byste mohli obejít, pokud nechcete místo VARCHAR2 použít CLOB.

V Oracle, když deklarujete sloupec, je výchozím nastavením použití sémantiky bytové délky. Například VARCHAR2(100) přiděluje 100 bajtů úložiště. Pokud používáte jednobajtovou znakovou sadu, jako je ISO 8859-1, každý znak vyžaduje 1 bajt úložného prostoru, takže se také přidělí místo pro 100 znaků. Pokud však používáte vícebajtovou znakovou sadu, jako je UFT-8, každý znak může vyžadovat 1 až 4 bajty úložiště. V závislosti na datech proto může být VARCHAR2(100) schopen uložit pouze 25 znaků dat (anglické znaky obvykle vyžadují 1 bajt, evropské znaky obvykle 2 bajty a asijské znaky obvykle 3 bajty).

Můžete říct Oracle, aby používal sémantiku délky znaků, což je normálně to, co bych navrhoval při přechodu z databáze ISO-8859-1 do databáze UTF-8. Pokud deklarujete sloupec VARCHAR2(100 CHAR), Oracle přidělí prostor pro 100 znaků bez ohledu na to, zda to skončí 100 bajty nebo 400 bajty. Můžete také nastavit parametr NLS_LENGTH_SEMANTICS na CHAR a změnit výchozí (pro nové DDL) tak, aby VARCHAR2(100) alokovalo 100 znaků místo 100 bajtů.

Bohužel pro vás je limit velikosti Oracle VARCHAR2 (v kontextu SQL engine spíše než PL/SQL engine) 4000 bajtů. Takže i když deklarujete sloupec VARCHAR2(4000 CHAR), stále budete omezeni na skutečné vložení 4000 bajtů dat, což může být až 1000 znaků. Například v databázi používající znakovou sadu AL32UTF8 mohu deklarovat sloupec VARCHAR2(4000 CHAR), ale vložení znaku, který vyžaduje 2 bajty úložiště, ukazuje, že ve skutečnosti nemohu vložit 4000 znaků dat

SQL> create table foo (
  2    col1 varchar2(4000 char)
  3  );

Table created.

SQL> insert into foo values( rpad( 'abcde', 4000, unistr('\00f6') ) );

1 row created.

SQL> ed
Wrote file afiedt.buf

  1* insert into foo values( rpad( 'abcde', 6000, unistr('\00f6') ) )
SQL> /

1 row created.

SQL> select length(col1), lengthb(col1)
  2    from foo;

LENGTH(COL1) LENGTHB(COL1)
------------ -------------
        2003          4000
        2003          4000

Pokud potřebujete uložit 4000 znaků dat UTF-8, budete potřebovat datový typ, který zvládne 16000 bajtů, což by vyžadovalo přesun do CLOB.




  1. funkce oracle bitand

  2. Oracle 10g:Extrahujte data (vyberte) z XML (typ CLOB)

  3. Jak získat jeden sloupec výsledků mysql_query do pole?

  4. Jak přepsat IS DISTINCT FROM a IS NOT DISTINCT FROM?