2014-12-04 36 views
3

我目前在oracle中使用了一个数据库,它有NLS_CHARACTERSET WE8ISO8859P1,所以可以说我在varchar2字段中存储值是maž(重音字符),所以在数据库中存储为maå¾。现在,当我尝试使用查询select * select * from field where fieldValue ='maž'时,它返回0行,然后当我尝试再次插入时,它给了我一个约束错误,说明值已经存在。NLS_CHARACTERSET Oracle中的WE8ISO8859P1和UTF8问题

如何克服这种情况。 我通过Java代码做这个

+0

_“在数据库中它被存储为maå¾”_你如何得到这个outpout?难道这不是[mojibake](http://en.wikipedia.org/wiki/Mojibake)的例子吗? – 2014-12-04 14:31:31

+0

你可以试试'ma \ u017E''吗?为了排除Java源代码编码问题等。您可以尝试使用通过ID获取记录字段的SELECT,以及**转储字节/代码点**。作为最后的手段,可能需要一个PreparedStatement来填写该字段。 – 2014-12-04 14:37:46

回答

1

http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch2charset.htm#g1009784

Oracle字符集名称:WE8ISO8859P1
说明:西欧8位ISO 8859第1个部分
地区:WE(西欧)
用于表示字符的位数:8

另一方面, UTF-8使用几个字节来存储一个符号。

如果您的数据库使用WE8ISO8859P1且列类型来自VARCHAR组(非NVARCHAR),并且您插入的代码> 255的符号,则此符号将转换为WE8ISO8859P1,并且某些信息将丢失。

简而言之,如果您将UTF-8插入到带有单字节字符集的数据库中,您的数据将丢失。

上面的链接描述了不同的场景如何解决这个问题。

您也可以尝试使用Oracle asciistr/unistr函数,但通常不是处理此类问题的好方法。

+0

所以我尝试了类似于java:String y = new String(x.getBytes(),Charset.forName(“ISO-8859-1”)); \t \t System.out.println(y);它会导致同样的事情,使用它来做选择并检查它是否存在是安全的。 – user958573 2014-12-04 14:50:00

+0

@ user958573它取决于X. UTF8具有更广泛的代码范围,因此如果将不同的符号从UTF8转换为ISO-8859-1,则它们在新字符集中可能具有相同的值 – Multisync 2014-12-04 14:56:35

+0

@ user958573但是,如果X fit的所有符号“ISO-8859-1”你可以做到这一点 – Multisync 2014-12-04 14:57:56