首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS标准版似乎忽略了NLS_LENGTH_SEMANTICS

AWS标准版似乎忽略了NLS_LENGTH_SEMANTICS
EN

Stack Overflow用户
提问于 2018-07-19 16:02:30
回答 1查看 417关注 0票数 2

下表如下:

代码语言:javascript
复制
SQL> DESC MM02.MMRZET01;
 Name                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 LPT_ID                         NUMBER(19)
 COU_ISO_ID                     VARCHAR2(2 CHAR)
 PRV_ID                         VARCHAR2(3 CHAR)
 LPT_NM                         VARCHAR2(30 CHAR)
 LPT_TYPE_CD                        VARCHAR2(1 CHAR)
 TOW_ID                         VARCHAR2(5 CHAR)
 TWN_ID                         VARCHAR2(2 CHAR)
 TOW_PCODE_TOWN_ID                  VARCHAR2(5 CHAR)
 TIZ_ID                         VARCHAR2(2 CHAR)
 LPT_HAS_ALIAS_IN                   VARCHAR2(1 CHAR)
 LPT_HAS_PLACE_IN                   VARCHAR2(1 CHAR)
 LPT_ID_MASTER                      NUMBER(19)
 LPT_NMKEY_TX                       VARCHAR2(6 CHAR)
 LPT_NM_CRUNCH_TX                   VARCHAR2(30 CHAR)
 LPT_PRIORITY_NR                    NUMBER(5)

以下查询不幸失败:

代码语言:javascript
复制
SQL> Insert into MM02.MMRZET01 (LPT_NMKEY_TX) values ('ÄÄÄÄ');
Insert into MM02.MMRZET01 (LPT_NMKEY_TX) values ('ÄÄÄÄ')
                                                 *
ERROR at line 1:
ORA-12899: value too large for column "MM02"."MMRZET01"."LPT_NMKEY_TX" (actual:
8, maximum: 6)

我试着跳过所有可能出现在谷歌或这里的圈圈。

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-19 16:10:34

如果您的$NLS_LANG不能处理多字节字符,您将看到这一点:

代码语言:javascript
复制
$ export NLS_LANG="ENGLISH_UNITED KINGDOM.US7ASCII"
$ sqlplus usr/pwd@db

SQL> Insert into MMRZET01 (LPT_NMKEY_TX) values ('ÄÄÄÄ');

ERROR at line 1:
ORA-12899: value too large for column "MY_SCHEMA"."MMRZET01"."LPT_NMKEY_TX"
(actual: 8, maximum: 6)

对于多字节设置,它可以工作:

代码语言:javascript
复制
$ export NLS_LANG="ENGLISH_UNITED KINGDOM.AL32UTF8"
$ sqlplus usr/pwd@db

SQL> Insert into MMRZET01 (LPT_NMKEY_TX) values ('ÄÄÄÄ');

1 row created.

在本例中,我的shell的$LANG设置为en_US.UTF-8,但是修改它或修改仿真器(PuTTY)的翻译似乎不会破坏它。但我相信在某些情况下是可以的。您确实需要仿真器、shell和DB会话设置匹配,以避免奇怪。

顺便说一句,您可以使用虚拟查询来查看是否发生了一些奇怪的事情;使用NLS_LANG="ENGLISH_UNITED KINGDOM.US7ASCII"

代码语言:javascript
复制
SQL> select 'ÄÄÄÄ', dump('ÄÄÄÄ', 1016) from dual;

'????????'
------------------------
DUMP('????????',1016)
--------------------------------------------------------------------------------
????????
Typ=96 Len=24 CharacterSet=AL32UTF8: ef,bf,bd,ef,bf,bd,ef,bf,bd,ef,bf,bd,ef,bf,b
d,ef,bf,bd,ef,bf,bd,ef,bf,bd

因此,您的insert尝试将八个字符ef,bf,bd (即替换字符 )作为问号呈现到您的6字符列中。考虑到实际要插入的内容,您所得到的错误是合理的。

NLS_LANG="ENGLISH_UNITED KINGDOM.AL32UTF8"

代码语言:javascript
复制
SQL> select 'ÄÄÄÄ', dump('ÄÄÄÄ', 1016) from dual;

'ÄÄÄÄ' DUMP('ÄÄÄÄ',1016)
---- -----------------------------------------------
ÄÄÄÄ   Typ=96 Len=4 CharacterSet=AL32UTF8: c4,c4,c4,c4

那就是你希望看到的

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

https://stackoverflow.com/questions/51427237

复制
相关文章

相似问题

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