我正在加载数据并将数据插入Oracle数据库。当我遇到看起来像中文字符的特殊字符时,我收到一个错误,比如拒绝行,因为超出了最大列数。对于具有相同列的相同长度的英文字符的行,我没有收到此错误。我正在使用SUBSTR和TRIM功能,但它无法正常工作。如何确定中文字符串的长度是否超过列大小?
答案 0 :(得分: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个字节)。