我的一个表中有一个类型为varchar2(2000)的列,但这是否意味着2000 bytes?还是2000 characters?因为我知道字节和字符之间有区别.
发布于 2019-08-20 16:59:04
缺省值是会话的NLS参数之一,即NLS_LENGTH_SEMANTICS。下面是我如何从我的会话中检查它:
select value
from v$nls_parameters
where parameter = 'NLS_LENGTH_SEMANTICS'
;
VALUE
------
BYTE您可以修改您的会话以更改值(也可以通过类似于的图形界面进行更改)。如果使用ALTER命令,也可以将ALTER命令放在LOGIN.SQL中(或者全局上是GLOGIN.SQL),如果您希望在每次启动会话时都分配一个特定的值。否则,当您启动新会话时,缺省值将来自您的SPFile (很可能)。
下面是我如何检查我的SPFile中的内容:
select value
from v$parameter
where name = 'nls_length_semantics'
;
VALUE
------
BYTE我也可以修改我的系统以改变SPFile中的内容,但这是DBA的工作(我认为)。无论如何,它都是可以改变的。
这与其他NLS参数类似--例如,考虑到NLS_DATE_FORMAT,其行为非常相似。
发布于 2019-08-20 17:16:53
此外,如果您有一个现有的表,则可以查询数据字典以查看所看到的大小(通过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总是以字节为单位的,因为这是真正的上限,并且是上限(在我的DB中为4000,可能是32k;在12c+中,MAX_STRING_SIZE设置为EXTENDED) --所以即使我已经说过在col2中允许使用2000个字符,如果我使用多字节字符,那么实际上允许我少于其中的2000个,因为总字节数可能会超过4000个。实际上,我会看到4000作为任何声明大于999 char的数据长度,因为它允许每个字符最多4个字节用于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)显式地声明它,这样就不会对将要发生的事情产生歧义或混淆。
https://stackoverflow.com/questions/57578188
复制相似问题