我知道我可以声明一个varchar2
,并指定它应该能够容纳的字符数。
然而,在我正在工作的 Oracle
数据库中,我发现一个字段(名为 PDF)被定义如下:
VARCHAR2(1 BYTE)
这是什么意思?它能包含多少个字符?
另一个相关的问题:一个VARCHAR
和一个VARCHAR2
有什么区别?
我知道我可以声明一个varchar2
,并指定它应该能够容纳的字符数。
然而,在我正在工作的 Oracle
数据库中,我发现一个字段(名为 PDF)被定义如下:
VARCHAR2(1 BYTE)
这是什么意思?它能包含多少个字符?
另一个相关的问题:一个VARCHAR
和一个VARCHAR2
有什么区别?
VARCHAR
数据类型 与 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 个字符。
请参见此示例(€
在 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
另请参阅BYTE和CHAR语义用法的示例和限制(NLS_LENGTH_SEMANTICS)(文档ID 144808.1)
回答你的第一个问题:
是的,它意味着1字节分配给1个字符。看这个例子
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>
接下来回答你的问题:
VARCHAR
可以存储最多 2000个字符
,而 VARCHAR2
可以存储最多 4000个字符
。VARCHAR
,则它将占用空值
的空间,在VARCHAR2
数据类型的情况下,它将不占用
任何空间。这意味着每个字符只会分配一个字节 - 所以如果你使用的是多字节字符集,你的1个字符就无法适应
如果你知道你至少需要为1个字符腾出足够的空间,请不要使用BYTE语法,除非你确切地知道需要多少空间来存储该字节
如果不确定,请使用VARCHAR2(1 CHAR)
在此处Difference between BYTE and CHAR in column datatypes有相同的解释
另外,在12c中,varchar2的最大长度现在为32k,而不是4000。如果你需要更多,请使用CLOB
在Oracle中,请不要使用VARCHAR
SYSTEM
级别上显式设置MAX_STRING_SIZE
为EXTENDED
,否则默认值将为4000
。 - Lalit Kumar BCHR(127)
,它也适用于多字节字符集。 - Wernfried Domscheit