在oracle中utf-8到utf-16的转换

时间:2011-08-17 13:59:43

标签: oracle10g utf

我实际上是以UTF-8格式在DB中存储资源。但是当我想将它们全部转换成UTF-16时。因为德语有一些像1/4的字符。现在我想避免这些。我已经尝试过遵循该声明,但在结果字符串中得到了一些框....

> select convert('Inhalt hinzufügen','AL16UTF16LE','AL32UTF8') from dual
  result : it is not allowing me to copy paste it :(. But result is coming properly except boxes in middle of each character

还有其他方法吗?

SELECT *
  FROM v$nls_parameters
 WHERE parameter LIKE '%CHARACTERSET';

表示我的数据库字符集是WE8MSWIN1252,而我的国家字符集是AL32UTF16。

当我使用DUMP函数查看实际存储在我的表中的数据时,这是输出:

SELECT dump( your_column, 1016 ), your_column
  FROM your_table
 WHERE some_key_column = <<value that gives you the row you're interested in>>
  

Typ = 1 Len = 54 CharacterSet = WE8MSWIN1252:   4D,C3,b6,63,68,74,65,6e,20,53,69,65,20,64,69,65,73,65,20,5a,65,69,6c,65,20, 77,69,72,6b,6C,69,63,68,20,65,6e,64,67,C3,BC,6C,74,69,67,20,6c,C3,b6,73,63 ,68,65,6e,3F,   MöchtenSiediese Zeilewirklicshndgültiglö¶schen?

1 个答案:

答案 0 :(得分:1)

由于您的数据库字符集是WE8MSWIN1252,因此您的数据有望不会实际存储为UTF-8。如果实际数据存储在CHAR,VARCHAR2或CLOB列中,则使用Windows-1252字符集存储数据,或者数据存储不正确。您可能已经错误地配置了NLS环境,因此您实际上是在数据库中存储了UTF-8数据,但希望不是这种情况。

根据DUMP函数的输出,您希望将哪个字符存储在数据的第三个位置? 0xB6是实际存储在数据库中的数据,该数据映射到Windows-1252 character set中的段落符号¶。假设这不是您期望的字符,那么看起来存储在数据库中的数据已经损坏。

您的数据使用哪种语言?您要存储的所有字符是否都出现在Windows-1252 character set

您是否尝试更改数据的存储方式?或者您是否尝试检索不同字符集中的数据?

如果数据库字符集是AL32UTF8,国家字符集是AL32UTF16,并且您希望使用UTF-16将数据存储在数据库中,则需要将数据移动到NVARCHAR2或NCLOB列。

如果您尝试将数据以UTF-8格式存储在数据库中,然后以UTF-16将其发送到客户端,则可以通过配置客户端的NLS设置自动完成。具体如何操作将取决于客户端如何访问数据库(JDBC,ODBC等)。