gpt4 book ai didi

oracle - 显示来自 oracle varchar2 的字符串的十六进制值?

转载 作者:行者123 更新时间:2023-12-03 23:23:16 26 4
gpt4 key购买 nike

我们遇到了以某些不同方式编码但保存在表中的单个列中的文本的问题。很长的故事。在 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”。

最佳答案

我有 UTF-8 中的字节开始。

String strFromUTF8 = new String(bytes, "UTF8");
byte[] strInOldStyle = strFromUTF8.getBytes("Cp1254");

有了 MySQL,我就完成了。我获取这些字节,将它们转换为十六进制字符串并使用 unhex(hexStr) 进行更新。这允许我将遗留字节放入 varchar 列。

使用 Oracle,我必须这样做:
String again = new String(strInOldStyle, "Cp1254");
byte[] nextOldBytes = again.getBytes("UTF8");

现在,我可以进行更新并将字节放入 varchar2 列中:
update table set colName = UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('hexStr')) where ...

奇怪,不是吗?我确信我已经使这比它需要的更复杂。

然而,我们看到的是,
"İ" in UTF-8 == 0xc4d0
"İ" in Cp1254 == 0xdd == "Ý" in Cp1252
"Ý" in UTF-8 == 0xc3d9

因此,如果我得到字符串“İ”并执行以下操作:
update table set name = UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('C3D9')) where ...

然后我们的旧客户端给了我们一个“İ”。是的。有用。

关于oracle - 显示来自 oracle varchar2 的字符串的十六进制值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18701984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com