VARCHAR datatype 与 VARCHAR2 数据类型同义。为避免可能的行为变化,请始终使用 VARCHAR2 数据类型来存储可变长度字符串。
如果您的数据库在单字节字符集(例如US7ASCII、WE8MSWIN1252 或WE8ISO8859P1)上运行,则使用VARCHAR2(x BYTE) 或VARCHAR2(x CHAR) 没有任何区别。
只有当您的数据库在多字节字符集(例如 AL32UTF8 或 AL16UTF16)上运行时才会有所不同。您可以在此示例中简单地看到它:
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) 表示您最多可以存储 1 个字符,无论它有多少字节。如果是 Unicode,一个字符最多可占用 4 个字节。
VARCHAR2(1 BYTE) 表示您可以存储一个最多占用的字符。 1 个字节。
如果您未指定BYTE 或CHAR,则默认值取自NLS_LENGTH_SEMANTICS 会话参数。
除非您有 Oracle 12c,您可以在其中设置 MAX_STRING_SIZE=EXTENDED 限制为 VARCHAR2(4000 CHAR)
但是,VARCHAR2(4000 CHAR) 并不意味着您可以保证最多存储 4000 个字符。限制仍然是 4000 字节,所以在最坏的情况下,您最多只能在该字段中存储 1000 个字符。
看这个例子(€ in UTF-8 占用 3 个字节):
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
另见Examples and limits of BYTE and CHAR semantics usage (NLS_LENGTH_SEMANTICS) (Doc ID 144808.1)