首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要理解使用NLS_LENGTH_SEMANTICS的Oracle语言

需要理解使用NLS_LENGTH_SEMANTICS的Oracle语言
EN

Stack Overflow用户
提问于 2017-02-10 04:30:20
回答 2查看 3.5K关注 0票数 0

我使用以下方法在Oracle12c中创建DataBase和表:

代码语言:javascript
复制
CREATE TABLE t
(a VARCHAR2(14 CHAR))

如果我想说:MARIE-TH R

代码语言:javascript
复制
INSERT INTO t (a) values ('MARIE-THÉRÈSE');

ERROR at line 1:
ORA-12899: value too large for column "T"."A" (actual: 15, maximum:
14)

一些资料:

代码语言:javascript
复制
    SQL> SELECT LENGTH('MARIE-THÉRÈSE') "Length in characters" FROM DUAL;

Length in characters
--------------------
                  15
SQL> SELECT LENGTHB ('MARIE-THÉRÈSE') "Length in bytes" FROM DUAL;

Length in bytes
---------------
             23
SELECT *
   FROM nls_database_parameters
   WHERE parameter = 'NLS_CHARACTERSET';

PARAMETER                      VALUE
------------------------------ --------------------
NLS_CHARACTERSET               AL32UTF8

SELECT value FROM NLS_DATABASE_PARAMETER
WHERE parameter='NLS_LENGTH_SEMANTICS';

VALUE
-----------------------------------
BYTE

怎样才能不修改这一列,而只修改甲骨文参数,就能把‘MARIE-TH R_(VARCHAR2)’写进本专栏(14 CHAR)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-20 00:13:58

解决办法是:

代码语言:javascript
复制
VARCHAR2(20) : Uses the default length semantics defined by the NLS_LENGTH_SEMANTICS parameter which defaults to BYTE.
VARCHAR2(20 BYTE) : Allows only the specified number of bytes to be stored in the column, regardless of how many characters this represents.
VARCHAR2(20 CHAR) : Allows the specified number of characters to be stored in the column regardless of the number of bytes this equates to.

SQL> CREATE TABLE tab2 (
  2    id           NUMBER(10),
  3    description  VARCHAR2(20 CHAR)
  4  );
Table created.

SQL> DESC tab2
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- -----------------
 ID                                                             NUMBER(10)
 DESCRIPTION                                                    VARCHAR2(20 CHAR)

可以使用NLS_LENGTH_SEMANTICS参数更改数据库或会话的默认字符语义。

代码语言:javascript
复制
ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR;
ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=BYTE;

ALTER SESSION SET NLS_LENGTH_SEMANTICS=CHAR;
ALTER SESSION SET NLS_LENGTH_SEMANTICS=BYTE;

如果我们将会话长度语义更改为字符,并描述表,我们可以看到,通过列定义的显示方式,更改已经受到了影响。

代码语言:javascript
复制
SQL> ALTER SESSION SET NLS_LENGTH_SEMANTICS=CHAR;

Session altered.

SQL> desc tab1
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- -----------------
 ID                                                             NUMBER(10)
 DESCRIPTION                                                    VARCHAR2(20 BYTE)

SQL> DESC tab2
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- -----------------
 ID                                                             NUMBER(10)
 DESCRIPTION                                                    VARCHAR2(20)

SQL>

INSTR、LENGTH和SUBSTR函数总是处理字符,而不考虑列定义和字符集。当您特别需要处理字节时,Oracle提供了INSTRB、LENGTHB和SUBSTRB函数。

票数 0
EN

Stack Overflow用户

发布于 2017-02-10 05:28:35

如果没有在DDL中指定长度语义参数,则定义默认使用的内容。例如,如果你说

代码语言:javascript
复制
CREATE TABLE T
( a VARCHAR2(14) )

然后,长度语义参数将确定列A是14个字节还是14个字符。

因此,在您的示例中,您有一个15个字符字符串,因此无论长度语义如何,您都不能将它插入到14个字符列中;您需要修改列定义。

代码语言:javascript
复制
ALTER TABLE T
MODIFY a VARCHAR2(15 CHAR)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42151547

复制
相关文章

相似问题

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