Oracle 中 VARCHAR2 的默认值是多少?
What is the default value of VARCHAR2 in Oracle?
我的一个表中有一个类型为 varchar2(2000)
的列,但这是否意味着 2000 bytes
?或 2000 characters
?因为我知道字节和字符是有区别的...
默认值为会话的 NLS
个参数之一,即 NLS_LENGTH_SEMANTICS
。以下是我如何从我的会话中检查它:
select value
from v$nls_parameters
where parameter = 'NLS_LENGTH_SEMANTICS'
;
VALUE
------
BYTE
您可以更改会话以更改值(或者您可以通过 SQL Developer 之类的图形界面来完成)。你也可以在 LOGIN.SQL
(或全局 GLOGIN.SQL
)中放置一个 ALTER SESSION 命令,如果你使用一个命令,如果你想在每次启动会话时分配一个特定的值。否则,当您开始新会话时,默认值将来自您的 SPFile(最有可能)。
以下是检查 SPFile 中内容的方法:
select value
from v$parameter
where name = 'nls_length_semantics'
;
VALUE
------
BYTE
我也可以改变我的系统来改变 SPFile 中的内容,但这是 DBA 的工作(我认为)。无论如何,它可以改变。
这与其他 NLS
参数相似 - 例如考虑 NLS_DATE_FORMAT
,行为非常相似。
除了@mathguy 的回答之外,如果您有一个现有的 table,您可以查询数据字典以查看您看到的大小(大概通过 describe
或类似的)是否以字节为单位或字符:
create table t (col1 varchar2(2000 byte), col2 varchar2(2000 char));
select column_name, data_type, data_length, char_length, char_used
from user_tab_columns
where table_name = 'T';
COLUMN_NAME DATA_TYPE DATA_LENGTH CHAR_LENGTH CHAR_USED
----------- --------- ----------- ----------- ---------
COL1 VARCHAR2 2000 2000 B
COL2 VARCHAR2 4000 2000 C
其中 char_used
是字符限制的 C 和字节限制的 B。
data_length
始终以字节为单位,因为这是真正的上限,并且有上限(在我的数据库中为 4000 - 可能是 32k;在 12c+ 中 MAX_STRING_SIZE
设置为 EXTENDED
) - 所以即使我说过 col2
中允许使用 2000 个字符,但如果我使用多字节字符,那么实际上允许的字符可能少于 2000 个,因为总字节数可能会超过 4000 . 我实际上将 4000 视为声明大于 999 char
的任何数据长度,因为它允许每个字符最多四个字节,对于 AL32UTF8.
SQL*Plus 等中的 describe
命令向您显示原始大小,还向您显示它是字节还是字符 - 但如果它与您会话的 NLS_LENGTH_SEMANTICS
设置:
alter session set nls_length_semantics = 'BYTE';
desc t;
Name Null? Type
---- ----- -------------------
COL1 VARCHAR2(2000)
COL2 VARCHAR2(2000 CHAR)
alter session set nls_length_semantics = 'CHAR';
desc t;
Name Null? Type
---- ----- -------------------
COL1 VARCHAR2(2000 BYTE)
COL2 VARCHAR2(2000)
如果您没有在 create 语句中指定 char
或 byte
,该设置也用于默认语义,正如@mathguy 所解释的那样;但与大多数 NLS 设置一样,明确说明它通常更好 (IMO),这样就不会对将要发生的事情产生歧义或混淆。
我的一个表中有一个类型为 varchar2(2000)
的列,但这是否意味着 2000 bytes
?或 2000 characters
?因为我知道字节和字符是有区别的...
默认值为会话的 NLS
个参数之一,即 NLS_LENGTH_SEMANTICS
。以下是我如何从我的会话中检查它:
select value
from v$nls_parameters
where parameter = 'NLS_LENGTH_SEMANTICS'
;
VALUE
------
BYTE
您可以更改会话以更改值(或者您可以通过 SQL Developer 之类的图形界面来完成)。你也可以在 LOGIN.SQL
(或全局 GLOGIN.SQL
)中放置一个 ALTER SESSION 命令,如果你使用一个命令,如果你想在每次启动会话时分配一个特定的值。否则,当您开始新会话时,默认值将来自您的 SPFile(最有可能)。
以下是检查 SPFile 中内容的方法:
select value
from v$parameter
where name = 'nls_length_semantics'
;
VALUE
------
BYTE
我也可以改变我的系统来改变 SPFile 中的内容,但这是 DBA 的工作(我认为)。无论如何,它可以改变。
这与其他 NLS
参数相似 - 例如考虑 NLS_DATE_FORMAT
,行为非常相似。
除了@mathguy 的回答之外,如果您有一个现有的 table,您可以查询数据字典以查看您看到的大小(大概通过 describe
或类似的)是否以字节为单位或字符:
create table t (col1 varchar2(2000 byte), col2 varchar2(2000 char));
select column_name, data_type, data_length, char_length, char_used
from user_tab_columns
where table_name = 'T';
COLUMN_NAME DATA_TYPE DATA_LENGTH CHAR_LENGTH CHAR_USED
----------- --------- ----------- ----------- ---------
COL1 VARCHAR2 2000 2000 B
COL2 VARCHAR2 4000 2000 C
其中 char_used
是字符限制的 C 和字节限制的 B。
data_length
始终以字节为单位,因为这是真正的上限,并且有上限(在我的数据库中为 4000 - 可能是 32k;在 12c+ 中 MAX_STRING_SIZE
设置为 EXTENDED
) - 所以即使我说过 col2
中允许使用 2000 个字符,但如果我使用多字节字符,那么实际上允许的字符可能少于 2000 个,因为总字节数可能会超过 4000 . 我实际上将 4000 视为声明大于 999 char
的任何数据长度,因为它允许每个字符最多四个字节,对于 AL32UTF8.
SQL*Plus 等中的 describe
命令向您显示原始大小,还向您显示它是字节还是字符 - 但如果它与您会话的 NLS_LENGTH_SEMANTICS
设置:
alter session set nls_length_semantics = 'BYTE';
desc t;
Name Null? Type
---- ----- -------------------
COL1 VARCHAR2(2000)
COL2 VARCHAR2(2000 CHAR)
alter session set nls_length_semantics = 'CHAR';
desc t;
Name Null? Type
---- ----- -------------------
COL1 VARCHAR2(2000 BYTE)
COL2 VARCHAR2(2000)
如果您没有在 create 语句中指定 char
或 byte
,该设置也用于默认语义,正如@mathguy 所解释的那样;但与大多数 NLS 设置一样,明确说明它通常更好 (IMO),这样就不会对将要发生的事情产生歧义或混淆。