Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将原始字节值放入oracle中的varchar2列中?_Java_Oracle_Encoding_Utf 8_Turkish - Fatal编程技术网

Java 如何将原始字节值放入oracle中的varchar2列中?

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) ----------------------

我们有一个老客户机正在与旧服务器应用程序对话。在土耳其,它以windows-1254发送文本。我们把它储存起来,然后寄回去

数据库中的一行有一个名称“İ”,它是一个大写字母I,顶部有一个点。在windows-1254中,这是一个0xdd字符,在UTF-8中,这是0xc4b0

如果我查看数据库,我会看到:

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;