2009-11-25 43 views
1

我正在加载并将数据插入Oracle数据库。当我遇到看起来像中文字符的特殊字符时,由于列的最大尺寸被超过,我得到一个错误,如行被拒绝。对于英文字符在同一列显示长度相同的行,我没有收到此错误。我正在使用SUBSTR和TRIM功能,但它不起作用。如何判断中文字符串的长度是否超过列大小?具有特殊字符的Oracle SQL加载表列

+0

你配置了NSLANG吗? – JuanZe 2009-11-25 13:27:40

回答

3

,如果你的列被定义为VARCHAR2(XX) [例如VARCHAR2(20)],你会如果您尝试插入一个字符串比XX 字节更长时间收到一个错误。

函数SUBSTR计算的字符,不字节数长度。要以字节为单位选择子字符串,请使用功能SUBSTRB

SQL> select substr('ЙЖ', 1, 2) from dual; 

SUBSTR('ЙЖ',1,2) 
------------------ 
ЙЖ 

SQL> select substrb('ЙЖ', 1, 2) from dual; 

SUBSTRB('ЙЖ',1,2) 
------------------- 
Й 

编辑:正如Adam建议,您可以使用字符算术,如果你定义的列和变量VARCHAR2 (XX CHAR)。在这种情况下,您的列将能够存储所有字符集中的XX个字符(如果将它存储在表中,则最多可以存储4000个字节)。

+1

您可能希望建议将架构定义从“VARCHAR2(XX)”更改为“VARCHAR2(XX CHAR)”,以使列长度为字符而不是字节。 – 2009-11-25 14:01:31

+0

感谢亚当,我更新了我的答案 – 2009-11-25 14:41:48

+0

之后,我使用VARCHAR2(XX CHAR)更改列架构定义,行拒绝的问题得到了消除,但我不得不将此值从分段加载到主表,我无法更改模式定义,所以,我做了一个substr,将其限制为不超过列大小,但现在我在执行SELECT * FROM TABLE,ORA-29275:部分多字节字符时收到新错误。 – Walker 2009-12-02 05:28:53