AWS RDS Oracle Standard版本似乎忽略了NLS_LENGTH_SEMANTICS

时间:2018-07-19 16:02:31

标签: oracle amazon-web-services amazon-rds utf

给出下表:

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)

以下查询惨遭失败:

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)

我尝试跳过可能在Google或此处找到的所有可能的篮球。

我在做什么错了?

1 个答案:

答案 0 :(得分:3)

如果您的idString无法处理多字节字符,您会看到以下消息:

$NLS_LANG

使用多字节设置可以正常工作:

$ 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)

在这种情况下,我的shell的$ export NLS_LANG="ENGLISH_UNITED KINGDOM.AL32UTF8" $ sqlplus usr/pwd@db SQL> Insert into MMRZET01 (LPT_NMKEY_TX) values ('ÄÄÄÄ'); 1 row created. 设置为$LANG,但是更改它或我的模拟器(PuTTY)转换似乎并没有破坏它。我确信在某些情况下可以。您确实需要仿真器,外壳程序和数据库会话设置相匹配以避免奇怪。


偶然地,您可以使用虚拟查询来查看是否发生了奇怪的事情;与en_US.UTF-8

NLS_LANG="ENGLISH_UNITED KINGDOM.US7ASCII"

因此,您的插入内容试图将8个字符the replacement characterwhat you'd expect to see)插入到您的6个字符的列中,该字符在此处呈现为问号。鉴于实际尝试插入的错误,您得到的错误是合理的。

使用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

ef,bf,bd

即{{3}}。