wake-up-neo.com

Was genau bedeutet, dass die Größe eines VARCHAR2-Feldes als 1 BYTE deklariert wird? (in eine Oracle DB)

Ich bin nicht so in database und ich habe den folgenden Zweifel.

Ich weiß, dass ich ein varchar2 -Feld mit der Nummer des Zeichens deklarieren kann, das es enthalten kann.

In einer Oracle -Datenbank, an der ich arbeite, wurde ein Feld (mit dem Namen PDF) wie folgt definiert:

VARCHAR2(1 BYTE)

Was genau bedeutet Wie viele Charaktere enthält es?

Ein weiterer Zweifel ist: Was genau ist der Unterschied zwischen einem VARCHAR -Feld und einem VARCHAR2 -Feld?

Tnx

16
AndreaNobili

Sie können Spalten/Variablen als varchar2 (n CHAR) und varchar2 (n Byte) deklarieren.

n CHAR bedeutet, dass die Variable n Zeichen enthält. In Multibyte-Zeichensätzen wissen Sie nicht immer, wie viele Bytes Sie speichern möchten, aber Sie möchten die Speicherung einer bestimmten Anzahl von Zeichen gewährleisten.

n Bytes bedeutet einfach die Anzahl der Bytes, die Sie speichern möchten.

varchar ist veraltet. Benutze es nicht. Was ist der Unterschied zwischen varchar und varchar2?

21
Rene

Der VARCHARDatentyp ist gleichbedeutend mit dem Datentyp VARCHAR2. Verwenden Sie zum Speichern von Zeichenfolgen variabler Länge immer den Datentyp VARCHAR2, Um mögliche Verhaltensänderungen zu vermeiden.

Wenn Ihre Datenbank mit einem Einzelbyte-Zeichensatz ausgeführt wird (z. B. US7ASCII, WE8MSWIN1252 Oder WE8ISO8859P1), Spielt es keine Rolle, ob Sie VARCHAR2(x BYTE) verwenden. oder VARCHAR2(x CHAR).

Es macht nur einen Unterschied, wenn Ihre DB mit einem Mehrbyte-Zeichensatz ausgeführt wird (z. B. AL32UTF8 Oder AL16UTF16). Sie können es einfach in diesem Beispiel sehen:

CREATE TABLE my_table (
    VARCHAR2_byte VARCHAR2(1 BYTE), 
    VARCHAR2_char VARCHAR2(1 CHAR)
);

INSERT INTO my_table (VARCHAR2_char) VALUES ('€');
1 row created.

INSERT INTO my_table (VARCHAR2_char) VALUES ('ü');
1 row created.

INSERT INTO my_table (VARCHAR2_byte) VALUES ('€');
INSERT INTO my_table (VARCHAR2_byte) VALUES ('€')
Error at line 10
ORA-12899: value too large for column "MY_TABLE"."VARCHAR2_BYTE" (actual: 3, maximum: 1)

INSERT INTO my_table (VARCHAR2_byte) VALUES ('ü')
Error at line 11
ORA-12899: value too large for column "MY_TABLE"."VARCHAR2_BYTE" (actual: 2, maximum: 1)

VARCHAR2(1 CHAR) bedeutet, dass Sie bis zu 1 Zeichen speichern können, unabhängig von der Anzahl der Bytes. Im Falle von Unicode kann ein Zeichen bis zu 4 Bytes belegen.

VARCHAR2(1 BYTE) bedeutet, dass Sie ein Zeichen speichern können, das max. 1 Byte.

Wenn Sie weder BYTE noch CHAR angeben, wird die Standardeinstellung aus dem Sitzungsparameter NLS_LENGTH_SEMANTICS Übernommen.

Sofern Sie nicht Oracle 12c haben, in dem Sie MAX_STRING_SIZE=EXTENDED Einstellen können, ist das Limit VARCHAR2(4000 CHAR)

Jedoch , VARCHAR2(4000 CHAR) bedeutet nicht, dass Sie garantiert bis zu 4000 Zeichen speichern können. Das Limit beträgt immer noch 4000 Bytes . Im schlimmsten Fall können Sie also nur bis zu 1000 Zeichen in einem solchen Feld speichern.

Siehe dieses Beispiel ( In UTF-8 belegt 3 Bytes):

CREATE TABLE my_table2(VARCHAR2_char VARCHAR2(4000 CHAR));

BEGIN
    INSERT INTO my_table2 VALUES ('€€€€€€€€€€');
    FOR i IN 1..7 LOOP
        UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char;
    END LOOP;
END;
/

SELECT LENGTHB(VARCHAR2_char) , LENGTHC(VARCHAR2_char) FROM my_table2;

LENGTHB(VARCHAR2_CHAR) LENGTHC(VARCHAR2_CHAR)
---------------------- ----------------------
                  3840                   1280
1 row selected.


UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char;

UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char
Error at line 1
ORA-01489: result of string concatenation is too long

Siehe auch Beispiele und Grenzen der Verwendung der Semantik BYTE und CHAR (NLS_LENGTH_SEMANTICS) (Doc ID 144808.1)

10

Um Ihre erste Frage zu beantworten:
Ja, das bedeutet, dass 1 Byte für 1 Zeichen reserviert ist. Schauen Sie sich dieses Beispiel an

SQL> conn / as sysdba
Connected.
SQL> create table test (id number(10), v_char varchar2(10));

Table created.

SQL> insert into test values(11111111111,'darshan');
insert into test values(11111111111,'darshan')
*
ERROR at line 1:
ORA-01438: value larger than specified precision allows for this column


SQL> insert into test values(11111,'darshandarsh');
insert into test values(11111,'darshandarsh')
*
ERROR at line 1:
ORA-12899: value too large for column "SYS"."TEST"."V_CHAR" (actual: 12,
maximum: 10)


SQL> insert into test values(111,'Darshan');

1 row created.

SQL> 

Und um Ihren nächsten zu beantworten: Der Unterschied zwischen varchar2 Und varchar:

  1. VARCHAR kann bis zu 2000 bytes Zeichen speichern, während VARCHAR2 bis zu 4000 bytes Zeichen speichern kann.
  2. Wenn wir den Datentyp als VARCHAR deklarieren, belegt er Platz für NULL values. Im Fall des Datentyps VARCHAR2 Belegt er not einen beliebigen Platz.
6
Darshan Lila

das bedeutet, dass NUR ein Byte pro Zeichen zugewiesen wird. Wenn Sie also Mehrbyte-Zeichensätze verwenden, passt Ihr 1-Zeichen nicht

wenn Sie wissen, dass Sie mindestens Platz für 1 Zeichen haben müssen, verwenden Sie die BYTE-Syntax nur, wenn Sie genau wissen, wie viel Platz Sie für die Speicherung dieses Bytes benötigen

im Zweifelsfall VARCHAR2 (1 CHAR) verwenden

gleiche Antwort hier nterschied zwischen BYTE und CHAR in Spaltendatentypen

In 12c ist das Maximum für varchar2 jetzt 32k, nicht 4000. Wenn Sie mehr als das benötigen, verwenden Sie CLOB

verwenden Sie in Oracle nicht VARCHAR

3
thatjeffsmith