在Oracle中处理¿

问题描述:

我有一个通过Web服务获取数据的程序,其中一些数据似乎是一个格式问题。在Oracle中处理¿

例如,我获取“XYZ¿ABC”等数据。

问题是我期待收到的数据长度定义为VARCHAR2(9 BYTE)。

在我的Java程序中,我可以看到数据的长度是9,但在尝试在Oracle端插入数据时,我得到一个字段长度不匹配错误(其中Oracle将它视为10)。

我改变了我的程序读取在ANSI格式的数据很好,但问题依然存在。

请告知,如果有一些改变,我应该让我的程序来处理这个(想法之一是在Oracle端使用子字符串,并将传入的数据限制为9字节,但我不想这样做,因为在这种情况下我可能会丢失一些数据)

关心。

+0

''¿'通常表示字符集转换问题。什么是你想要处理的正确的字符串? Oracle数据库中的字符集是什么? – sstan

+1

该数据的长度是9个字符,但字节数取决于编码。在UTF-8中,它是10个字节。您应该决定是否要在插入之前更改字段的定义或清理数据。 – RealSkeptic

+0

''是一个字符的地方持有人,不能存储在您的数据库或您的客户端无法存储。你的数据库字符集是什么,你期望输出什么? –

虽然“XYZ ABC”为9 个字符,但它不是9个字节。这是因为¿是UTF-8中的多字节字符。

Oracle有two solutions用于在数据库中启用unicode,但是在这里发布整个东西作为答案太长。

+0

没有“¿”表示任何“不可显示”的字符。在很多情况下,它将是一个多字节字符,但它不是强制性的。 –

有两件事情可能发生。一个是有损压缩。在这种情况下,您将一个坏字符保存在数据库中,并且无法“格式化”回来,因为所有这些字符都被错误地缩减为相同的代码。在这种情况下,你可以看到数据被保存为与原始代码:

select DUMP('your string') from dual 

第二种情况,是有只是字符集之间的不匹配。

对于这两个问题,您需要确保您传递的所有数据都使用相同的字符集进行编码。 UTF-8是一个普遍支持的。如果你没有任何非美国人的字符,ASCII是最好的。

要查看的内容:

java使用什么字符集? Oracle将数据保存为什么字符集? 您的驱动程序支持哪些字符集?

该问题已通过将数据类型更改为9个字符解决。