web-dev-qa-db-fra.com

Qu'est-ce qui signifie exactement que la taille d'un champ VARCHAR2 est déclarée 1 BYTE? (dans une base de données Oracle)

Je ne suis pas tellement dans database et j’ai le doute suivant.

Je sais que je peux déclarer un varchar2 champ en utilisant le numéro du caractère qu’il peut contenir.

Mais dans une base de données Oracle sur laquelle je travaille, j'ai découvert qu'un champ (nommé PDF) est défini comme:

VARCHAR2(1 BYTE)

Que signifie exactement? Combien de personnages il contient?

Un autre doute est: quelle est exactement la différence entre un champ VARCHAR et un VARCHAR2 champ?

Tnx

16
AndreaNobili

Vous pouvez déclarer des colonnes/variables en tant que varchar2 (n CHAR) et varchar2 (n octet).

n CHAR signifie que la variable contiendra n caractères. Dans les jeux de caractères multi-octets, vous ne savez pas toujours combien d'octets vous souhaitez stocker, mais vous voulez garantir le stockage d'une certaine quantité de caractères.

n octets signifie simplement le nombre d'octets que vous souhaitez stocker.

varchar est obsolète. Ne l'utilise pas. Quelle est la différence entre varchar et varchar2?

21
Rene

Le VARCHARtype de données est synonyme du type de données VARCHAR2. Pour éviter tout changement de comportement, utilisez toujours le type de données VARCHAR2 Pour stocker des chaînes de caractères de longueur variable.

Si votre base de données fonctionne sur un jeu de caractères codé sur un octet (par exemple, US7ASCII, WE8MSWIN1252 Ou WE8ISO8859P1), Le fait que vous utilisiez VARCHAR2(x BYTE) ne change rien. ou VARCHAR2(x CHAR).

Cela ne fait une différence que lorsque votre base de données s'exécute sur un jeu de caractères multi-octets (par exemple, AL32UTF8 Ou AL16UTF16). Vous pouvez simplement le voir dans cet exemple:

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) signifie que vous pouvez stocker jusqu'à 1 caractère, quel que soit le nombre d'octets dont il dispose. En cas d'Unicode, un caractère peut occuper jusqu'à 4 octets.

VARCHAR2(1 BYTE) signifie que vous pouvez stocker un caractère qui occupe max. 1 octet.

Si vous ne spécifiez ni BYTE ni CHAR, la valeur par défaut est prise à partir du paramètre de session NLS_LENGTH_SEMANTICS.

Sauf si vous avez Oracle 12c où vous pouvez définir MAX_STRING_SIZE=EXTENDED, La limite est VARCHAR2(4000 CHAR)

Cependant , VARCHAR2(4000 CHAR) ne signifie pas que vous êtes sûr de stocker jusqu'à 4000 caractères. La limite est toujours de 4000 octets . Dans le pire des cas, vous ne pouvez stocker que 1 000 caractères dans ce champ.

Voir cet exemple ( Dans UTF-8 occupe 3 octets):

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

Voir aussi Exemples et limites d'utilisation de la sémantique BYTE et CHAR (NLS_LENGTH_SEMANTICS) (Doc ID 144808.1)

10

Pour répondre à votre première question:
Oui, cela signifie qu'un octet est alloué pour un caractère. Regardez cet exemple

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> 

Et pour répondre à votre prochain: La différence entre varchar2 et varchar:

  1. VARCHAR peut stocker jusqu'à 2000 bytes de caractères tandis que VARCHAR2 peut stocker jusqu’à 4000 bytes de caractères.
  2. Si nous déclarons le type de données sous la forme VARCHAR, il occupera de l'espace pour NULL values, En cas de VARCHAR2 _ type de données _ not occupera n’importe quel espace.
6
Darshan Lila

cela signifie que SEUL un octet sera alloué par caractère - donc si vous utilisez des jeux de caractères multi-octets, votre 1 caractère ne tiendra pas

si vous savez que vous devez disposer d'au moins assez de place pour 1 caractère, n'utilisez pas la syntaxe BYTE, sauf si vous savez exactement combien d'espace vous aurez besoin pour stocker cet octet.

en cas de doute, utilisez VARCHAR2 (1 CHAR)

même réponse ici Différence entre BYTE et CHAR dans les types de données de colonne

De plus, en 12c, le maximum pour varchar2 est maintenant de 32k, et non de 4000. Si vous avez besoin de plus que cela, utilisez CLOB.

dans Oracle, n'utilisez pas VARCHAR

3
thatjeffsmith