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 语句中指定 charbyte,该设置也用于默认语义,正如@mathguy 所解释的那样;但与大多数 NLS 设置一样,明确说明它通常更好 (IMO),这样就不会对将要发生的事情产生歧义或混淆。