AWS RDS Oracle 标准版似乎忽略了 NLS_LENGTH_SEMANTICS
AWS RDS Oracle Standard edition seems to ignore NLS_LENGTH_SEMANTICS
给出以下 table:
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 或此处找到的可能的问题。
我做错了什么?
如果您的 $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)
多字节设置有效:
$ 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 和数据库会话设置匹配以避免奇怪。
顺便说一句,您可以使用虚拟查询来查看是否发生了奇怪的事情; NLS_LANG="ENGLISH_UNITED KINGDOM.US7ASCII"
:
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
(即 the replacement character 并在此处呈现为问号)放入您的 6 字符列中。考虑到它实际尝试插入的内容,您得到的错误是合理的。
与NLS_LANG="ENGLISH_UNITED KINGDOM.AL32UTF8"
:
SQL> select 'ÄÄÄÄ', dump('ÄÄÄÄ', 1016) from dual;
'ÄÄÄÄ' DUMP('ÄÄÄÄ',1016)
---- -----------------------------------------------
ÄÄÄÄ Typ=96 Len=4 CharacterSet=AL32UTF8: c4,c4,c4,c4
给出以下 table:
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 或此处找到的可能的问题。
我做错了什么?
如果您的 $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)
多字节设置有效:
$ 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 和数据库会话设置匹配以避免奇怪。
顺便说一句,您可以使用虚拟查询来查看是否发生了奇怪的事情; NLS_LANG="ENGLISH_UNITED KINGDOM.US7ASCII"
:
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
(即 the replacement character 并在此处呈现为问号)放入您的 6 字符列中。考虑到它实际尝试插入的内容,您得到的错误是合理的。
与NLS_LANG="ENGLISH_UNITED KINGDOM.AL32UTF8"
:
SQL> select 'ÄÄÄÄ', dump('ÄÄÄÄ', 1016) from dual;
'ÄÄÄÄ' DUMP('ÄÄÄÄ',1016)
---- -----------------------------------------------
ÄÄÄÄ Typ=96 Len=4 CharacterSet=AL32UTF8: c4,c4,c4,c4