varchar2(n BYTE | CHAR)默认 - > CHAR或BYTE

use*_*229 32 sql oracle

我支持以下模式声明的代码: -

create table sample (
        id number Primary key,
        username varchar2(100),
);
Run Code Online (Sandbox Code Playgroud)

我查看了Oracle文档&varchar2有两个声明模式varchar2(n BYTE)和varchar2(n CHAR),如果我没有明确指定BYTE或CHAR并且只声明用户名varchar2(500)那么将分配500个BYTES或500个字符?

谢谢,

Jus*_*ave 35

默认值是您的NLS_LENGTH_SEMANTICS参数设置为的任何值.默认情况下,这BYTE与Oracle的旧版本一致,其中没有使用字符长度语义的选项.如果您正在定义自己的模式并且使用的是可变宽度字符集(如AL32UTF8),我强烈建议设置NLS_LENGTH_SEMANTICS为CHAR,因为您几乎总是打算以字节而不是以字节为单位指定长度.

  • 您可能希望将设置NLS_LENGTH_SEMANTICS添加到CHAR将*不*克服VARCHAR列的4000**字节**的限制. (14认同)
  • 在[this](https://docs.oracle.com/cd/E24693_01/server.11203/e24448/initparams149.htm)页面上说:_警告:Oracle强烈建议您不要将NLS_LENGTH_SEMANTICS参数设置为CHAR。实例或服务器参数文件。这可能会导致许多现有的安装脚本意外地创建具有字符长度语义的列,从而导致运行时错误,包括缓冲区溢出。_正如您所说,几乎总是打算用字符指定长度。那真让我沮丧。我应该不知道的是,我不时需要增加一些列大小。 (2认同)
  • @mkb - 参数也可以在会话级别设置.如果您不希望在实例级别设置对象的风险,则在定义对象时在会话级别设置参数.或者在运行Oracle安装脚本之前,将其在实例级别设置回BYTE. (2认同)

Den*_*gin 11

您可以使用以下查询检查当前值:

SELECT
  value

FROM
  NLS_DATABASE_PARAMETERS

WHERE
  parameter='NLS_LENGTH_SEMANTICS';
Run Code Online (Sandbox Code Playgroud)