我们有一个旧客户端与旧服务器应用程序交谈。在土耳其,它将文本作为 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
客户端将此行显示为“İ”。但是,你知道,哇。这似乎很荒谬。但如果这是可行的,那可能就是必须发生的事情......