Java 如何将原始字节值放入oracle中的varchar2列中?
我们有一个老客户机正在与旧服务器应用程序对话。在土耳其,它以windows-1254发送文本。我们把它储存起来,然后寄回去 数据库中的一行有一个名称“İ”,它是一个大写字母I,顶部有一个点。在windows-1254中,这是一个0xdd字符,在UTF-8中,这是0xc4b0 如果我查看数据库,我会看到:Java 如何将原始字节值放入oracle中的varchar2列中?,java,oracle,encoding,utf-8,turkish,Java,Oracle,Encoding,Utf 8,Turkish,我们有一个老客户机正在与旧服务器应用程序对话。在土耳其,它以windows-1254发送文本。我们把它储存起来,然后寄回去 数据库中的一行有一个名称“İ”,它是一个大写字母I,顶部有一个点。在windows-1254中,这是一个0xdd字符,在UTF-8中,这是0xc4b0 如果我查看数据库,我会看到: SQL> select dump(name, 16) from thing where other thing; DUMP(NAME,16) ----------------------
SQL> select dump(name, 16) from thing where other thing;
DUMP(NAME,16)
--------------------------------------------------------------------------------
Typ=1 Len=2: c3,9d
奇怪。不过,正如有人在另一个问题中指出的那样
在windows-1254中,“İ”字符是0xdd。windows-1252中的0xdd是“Ý”字符,UTF-8中的0xc39d。因此,我们看到的是
我们认为我们想做的是这样,但显然不起作用:
SQL> update thing set name = UTL_RAW.CAST_TO_VARCHAR2(UTL_RAW.CONVERT(HEXTORAW('dd'), 'CP1254', 'UTF8')) where otherthing;
update thing set name = UTL_RAW.CAST_TO_VARCHAR2(UTL_RAW.CONVERT(HEXTORAW('dd'), 'CP1254', 'UTF8')) where otherthing
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.UTL_RAW", line 327
嗯
很多文档都在讨论UTL_RAW.CONVERT,但没有人给出实际使用的例子。为什么呢?是否有允许的NLS字符集名称列表?我找不到。有什么建议吗?我可以找到java知道的所有编码的列表,但是我找不到Oracle的这个列表
我有一个java应用程序,我正在使用它来编写必须由遗留软件读取的数据。该应用程序接收UTF-8。我可以成功地将其转换为windows-1254字节。我可以把它们翻译成windows-1252。如果我随后将其转换为UTF-8,我可以使用以下命令将其写入数据库:
SQL> update this set name = UTL_RAW.CAST_TO_VARCHAR2(hextoraw('c39d')) where otherthing;
1 row updated.
SQL> select dump(name, 16) from thing where otherthing;
DUMP(NAME,16)
--------------------------------------------------------------------------------
Typ=1 Len=2: c3,9d
客户机将该行显示为“İ”。但是,你知道,哇。这似乎很荒谬。但是,如果这是可行的,那可能就是必须发生的事情。…文档中没有解释的是,根据UTL_RAW,一个字符集由三部分组成;NLS_语言、NLS_区域和字符集本身。要查看有效值的列表,可以查询。有关语言和地区的完整列表,请参阅 这就引出了你的第一个问题。根据Oracle,Win-1254不是CP1254,而是TR8MSWIN1254。同样,虽然UTF8字符集存在,但我怀疑您的数据库是使用AL32UTF8设置的。您可以通过查询进行双重检查 所以,如果这是土耳其语,而你在土耳其,让我们假设你的语言和领土就是土耳其语 现在,在字符集前面加上该字符将返回所需内容:
select utl_raw.convert( hextoraw('dd')
, 'TURKISH_TURKEY.AL32UTF8'
, 'TURKISH_TURKEY.TR8MSWIN1254'
) as raw_char
from dual;
RAW_CHAR
-----------------------------------------------------
C4B0
正如您已经注意到的,0xc4b0是UTF-8中İ的表示形式,因此您可以使用UTL_RAW.CAST_TO_VARCHAR2
,如您所愿1:
一,。我没有一个基于文本的Oracle客户端可以代表这个角色;对不起
select utl_raw.cast_to_varchar2(
utl_raw.convert( hextoraw('dd')
, 'TURKISH_TURKEY.AL32UTF8'
, 'TURKISH_TURKEY.TR8MSWIN1254'
)) as new_char
from dual;