gpt4 book ai didi

sql - ORA-29275 : partial multibyte character

转载 作者:行者123 更新时间:2023-12-04 15:59:51 34 4
gpt4 key购买 nike

我的输入数据来自一个平面文件,该文件在一列中包含英文、日文、中文字符。
我将这些值加载到架构定义为 VARCHAR2(250 CHAR) 的临时表列中,主表列的定义为 VARCHAR2(250),我无法更改。
所以,我正在这个专栏上做一个 SUBSTR。当我做了一个加载表后

SELECT * FROM TABLE

...我收到此错误:

ORA-29275: partial multibyte character



如果我选择其他列,则没有问题。

最佳答案

将数据从 SUBSTRB 列复制到 250 CHAR 列时,应使用 250 byte。这个函数只会输出整个字符(你不会得到不完整的 unicode 字符):

SQL> select substrb('中华人', 1, 9) ch9,
2 substrb('中华人', 1, 8) ch8,
3 substrb('中华人', 1, 7) ch7,
4 substrb('中华人', 1, 6) ch6,
5 substrb('中华人', 1, 5) ch5
6 FROM dual;

CH9 CH8 CH7 CH6 CH5
--------- -------- ------- ------ -----
中华人 中华 中华 中华 中

编辑:

@mwardm 对结果字符串的实际长度以及结果字符串是否可能包含无效的字节序列进行了有趣的评论。在 AL32UTF8 DB 上考虑以下内容:
SQL> select lengthb('ÏÏÏ'),
2 lengthb(substrb('ÏÏÏÏÏÏ', 1, 5)),
3 dump('ÏÏÏ'),
4 dump(substrb('ÏÏÏÏÏÏ', 1, 5))
5 FROM dual;

LE LE DUMP('ÏÏÏ') DUMP(SUBSTRB('ÏÏÏÏÏÏ',1,5))
-- -- ------------------------------------- -------------------------------
6 5 Typ=96 Len=6: 195,143,195,143,195,143 Typ=1 Len=5: 195,143,195,143,32

如您所见, substrb 字符串的最后一个字节不是特殊字符的截断第一个字节,而是编码了一个合法字符(此字符集中的前 128 个字符与 ASCII7US 字符集相同,因此对 ' ' 空格字符进行编码,按照另一个答案中的建议使用 RTRIM 将删除最后一个字符)。

此外,我还使用字符集 AL16UTF16 得到了这个有趣的结果:
SQL> select lengthb(N'ĈĈ') le,
2 dump(N'ĈĈ') dump,
3 lengthb(substrb(N'Ĉ', 1, 3)) length_substr,
4 dump(substrb(N'ĈĈ', 1, 3)) dump_substr
5 from dual;

LE DUMP LENGTH_SUBSTR DUMP_SUBSTR
---------- ----------------------- ------------- -----------------
4 Typ=96 Len=4: 1,8,1,8 2 Typ=1 Len=2: 1,8

在这种情况下,Oracle 选择在第二个字节之后剪切字符串,因为在 AL16UTF16 字符集中没有合法的单字节字符。结果字符串只有 2 个字节,而不是 3 个。

这需要进一步测试,绝不是严格的演示,但我仍然支持我的第一个预感,即 substrb 将返回一个有效的字节序列,该序列对有效的字符串进行编码。

关于sql - ORA-29275 : partial multibyte character,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1830861/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com