首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >甲骨文中VARCHAR2的默认值是多少?

甲骨文中VARCHAR2的默认值是多少?
EN

Stack Overflow用户
提问于 2019-08-20 16:43:51
回答 2查看 4.4K关注 0票数 1

我的一个表中有一个类型为varchar2(2000)的列,但这是否意味着2000 bytes?还是2000 characters?因为我知道字节和字符之间有区别.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-20 16:59:04

缺省值是会话的NLS参数之一,即NLS_LENGTH_SEMANTICS。下面是我如何从我的会话中检查它:

代码语言:javascript
复制
select value
from   v$nls_parameters
where  parameter = 'NLS_LENGTH_SEMANTICS'
;

VALUE 
------
BYTE

您可以修改您的会话以更改值(也可以通过类似于的图形界面进行更改)。如果使用ALTER命令,也可以将ALTER命令放在LOGIN.SQL中(或者全局上是GLOGIN.SQL),如果您希望在每次启动会话时都分配一个特定的值。否则,当您启动新会话时,缺省值将来自您的SPFile (很可能)。

下面是我如何检查我的SPFile中的内容:

代码语言:javascript
复制
select value
from   v$parameter
where  name = 'nls_length_semantics'
;


VALUE 
------
BYTE

我也可以修改我的系统以改变SPFile中的内容,但这是DBA的工作(我认为)。无论如何,它都是可以改变的。

这与其他NLS参数类似--例如,考虑到NLS_DATE_FORMAT,其行为非常相似。

票数 3
EN

Stack Overflow用户

发布于 2019-08-20 17:16:53

此外,如果您有一个现有的表,则可以查询数据字典以查看所看到的大小(通过describe或类似的假设)是否以字节或字符为单位:

代码语言:javascript
复制
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总是以字节为单位的,因为这是真正的上限,并且是上限(在我的DB中为4000,可能是32k;在12c+中,MAX_STRING_SIZE设置为EXTENDED) --所以即使我已经说过在col2中允许使用2000个字符,如果我使用多字节字符,那么实际上允许我少于其中的2000个,因为总字节数可能会超过4000个。实际上,我会看到4000作为任何声明大于999 char的数据长度,因为它允许每个字符最多4个字节用于AL32UTF8。

SQL*Plus等中的describe命令显示了原始大小,还显示了它是字节还是字符--但如果它与会话的NLS_LENGTH_SEMANTICS设置匹配,则忽略这一点:

代码语言:javascript
复制
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)显式地声明它,这样就不会对将要发生的事情产生歧义或混淆。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57578188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档