栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

无法使用Hibernate / PostgreSQL将欧元符号存储到LOB String属性中

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

无法使用Hibernate / PostgreSQL将欧元符号存储到LOB String属性中

在深入研究Hibernate的源代码和PostgreSQL
JDBC驱动程序之后,我设法找到了问题的根本原因。最后,调用BlobOutputStream的write()方法(由JDBC驱动程序提供)以将Clob的内容写入数据库。此方法如下所示:

public void write(int b) throws java.io.IOException{    checkClosed();    try    {        if (bpos >= bsize)        { lo.write(buf); bpos = 0;        }        buf[bpos++] = (byte)b;    }    catch (SQLException se)    {        throw new IOException(se.toString());    }}

此方法将“ int”(32位/ 4字节)作为参数,并将其转换为“ byte”(8位/
1字节),实际上会丢失3个字节的信息。Java中的字符串表示形式是UTF-16编码的,这意味着每个字符都由16位/
2字节表示。欧元符号的int值为8364。转换为字节后,保留值172(以八位位组表示254)。

我不确定现在最好的解决方案是什么。恕我直言,JDBC驱动程序应负责将Java
UTF-16字符编码/解码为数据库所需的任何编码。但是,我看不到JDBC驱动程序代码中有任何调整可能性来改变其行为(并且我不想编写和维护自己的JDBC驱动程序代码)。

因此,我使用自定义的ClobType扩展了Hibernate,并在将其写入数据库之前设法将UTF-16字符转换为UTF-8,反之亦然。

解决方案太大,无法简单地粘贴到此答案中。如果您有兴趣,请给我留言,然后发送给您。

干杯,弗兰克



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447669.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号