我们遇到了以某些不同方式编码但保存在表中的单个列中的文本的问题。很长的故事。在 MySQL 上,我可以执行“从表中选择 hex(str)”,并且我看到的字符串字节与我设置的完全相同。
在 Oracle 上,我有一个以土耳其字符 İ 开头的字符串,它是 Unicode 字符 0x0130“带点上方的拉丁大写字母”。这是我印刷的 Unicode 2.0 版书籍。在 UTF-8 中,这个字符是 0xc4b0。
我们需要支持非常旧的客户端应用程序。他们会在“windows-1254”中向我们发送此文本。我们过去只是闭上眼睛,把它储存起来,然后再交还给它。现在我们需要Unicode,或者正在被赋予Unicode。
所以我有:
SQL> select id, name from table where that thing;
ID NAME
------ ------------------------
746 Ý
这是有道理的,因为 windows-1254 中的“İ”是 0xdd,wondows-1252 中的 0xdd 是“Ý”。我的终端大概设置为通常的 windows-1252。
但:
SQL> select id, rawtohex(name) from table where that thing;
ID RAWTOHEX(NAME)
------ ------------------------
746 C39D
似乎没有与 MySQL 中的 hex(name) 函数等效的功能。但我一定是错过了什么。我在这里想念什么?
我的 java 代码必须采用我提供的 utf8 并保存一个 utf8 副本和一个 windows-1252 副本。java代码给了我:
bytes (utf8): c4 b0
bytes (1254): dd
然而,当我保存它时,客户端没有得到正确的字符。当我尝试查看 Oracle 实际存储的内容时,我得到了上面看到的垃圾。我不知道 C39D 是从哪里来的。有什么建议么?
我们在所有应用程序中都内置了 ojdbc14.jar,并且我们正在连接到一个数据库,该数据库显示它是“Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production”。