Oracle 中 VARCHAR2 的大小声明为 1 个字节是什么意思?
What does it mean when the size of a VARCHAR2 in Oracle is declared as 1 byte?
我知道我可以使用它应该能够包含的字符数声明一个 varchar2
。
但是,在我工作的 Oracle
数据库中,我发现一个字段(名为 PDF)定义如下:
VARCHAR2(1 BYTE)
这是什么意思?它可以包含多少个字符?
另一个相关问题:VARCHAR
和 VARCHAR2
有什么区别?
回答你第一个问题:
是的,这意味着 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>
然后回答你的下一个问题:
varchar2
和varchar
的区别:
VARCHAR
最多可存储 2000 bytes
个字符,而 VARCHAR2
最多可存储 4000 bytes
个字符。
- 如果我们将数据类型声明为
VARCHAR
那么它将占用 space for NULL values
,如果是 VARCHAR2
数据类型它将 not
占用任何 space.
您可以将 columns/variables 声明为 varchar2(n CHAR) 和 varchar2(n byte)。
n CHAR 表示变量将包含 n 个字符。在多字节字符集中,您并不总是知道要存储多少字节,但您确实希望保证存储一定数量的字符。
n 字节表示您要存储的字节数。
varchar 已弃用。不要使用它。
What is the difference between varchar and varchar2?
这意味着每个字符只会分配一个字节 - 所以如果您使用多字节字符集,您的 1 个字符将不适合
如果您知道必须至少有足够的空间容纳 1 个字符,请不要使用 BYTE 语法,除非您确切知道存储该字节需要多少空间
如有疑问,请使用 VARCHAR2(1 CHAR)
这里回答了同样的事情Difference between BYTE and CHAR in column datatypes
此外,在 12c 中,varchar2 的最大值现在是 32k,而不是 4000。如果您需要更多,请使用 CLOB
在 Oracle 中,不要使用 VARCHAR
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 个字符。
看这个例子(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)
我知道我可以使用它应该能够包含的字符数声明一个 varchar2
。
但是,在我工作的 Oracle
数据库中,我发现一个字段(名为 PDF)定义如下:
VARCHAR2(1 BYTE)
这是什么意思?它可以包含多少个字符?
另一个相关问题:VARCHAR
和 VARCHAR2
有什么区别?
回答你第一个问题:
是的,这意味着 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>
然后回答你的下一个问题:
varchar2
和varchar
的区别:
VARCHAR
最多可存储2000 bytes
个字符,而VARCHAR2
最多可存储4000 bytes
个字符。- 如果我们将数据类型声明为
VARCHAR
那么它将占用 space forNULL values
,如果是VARCHAR2
数据类型它将not
占用任何 space.
您可以将 columns/variables 声明为 varchar2(n CHAR) 和 varchar2(n byte)。
n CHAR 表示变量将包含 n 个字符。在多字节字符集中,您并不总是知道要存储多少字节,但您确实希望保证存储一定数量的字符。
n 字节表示您要存储的字节数。
varchar 已弃用。不要使用它。 What is the difference between varchar and varchar2?
这意味着每个字符只会分配一个字节 - 所以如果您使用多字节字符集,您的 1 个字符将不适合
如果您知道必须至少有足够的空间容纳 1 个字符,请不要使用 BYTE 语法,除非您确切知道存储该字节需要多少空间
如有疑问,请使用 VARCHAR2(1 CHAR)
这里回答了同样的事情Difference between BYTE and CHAR in column datatypes
此外,在 12c 中,varchar2 的最大值现在是 32k,而不是 4000。如果您需要更多,请使用 CLOB
在 Oracle 中,不要使用 VARCHAR
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 个字符。
看这个例子(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)