Hibernate + JPA + jTDS + SQL Server = Unicode 问题

Posted

技术标签:

【中文标题】Hibernate + JPA + jTDS + SQL Server = Unicode 问题【英文标题】:Hibernate + JPA + jTDS + SQL Server = Unicode Problems 【发布时间】:2014-11-02 08:49:51 【问题描述】:

我维护了一个作为 Servlet 运行的软件,可以使用 mysql、Oracle 或 SQL Server 作为数据库后端 - 取决于客户想要使用什么。

一切都与 MySQLOracle 完美配合,SQL Server 也很好用,除了我无法将 Unicode 序列插入/更新到数据库中 .

我可以在 SQL Server Management Studio 中手动插入这样的 unicode 序列

INSERT INTO mytable (msg) VALUES (N'Modern Standard Hindi (मानक हिन्दी), is a standardised and Sanskritised register of the Hindustani language.')

这个数据在我的软件中输出正确,由此验证数据库和web前端都可以处理unicode没问题。

这是我的连接字符串

jdbc:jtds:sqlserver://<server ip>:1433/MyDb

正如我所说,OracleMySQL 使用此设置可以完美运行。 SQL Server 有什么不同?

注意:我也试过微软官方提供的 JDBC 驱动,结果完全一样。

如果有所作为,我将使用JPA Repositories 进行数据库交互。整个 webapp 也设置为 SpringMVC 应用程序。

编辑:我还尝试将useUnicode=true;characterEncoding=UTF-8 添加到连接字符串的末尾,结果相同

【问题讨论】:

【参考方案1】:

您可能需要在连接字符串中指定您正在使用 Unicode,以及您正在使用什么编码。也许是这样的?

jdbc:jtds:sqlserver://<server_ip>:1433;databaseName=MyDb;useUnicode=true;characterEncoding=UTF-8

【讨论】:

谢谢,但不幸的是我已经尝试过了,但无济于事。结果是相同的。插入“فُصْحَى”会导致“ÙÙصÙØÙÙ”仍保存在数据库中。 您添加了 7 个 unicode 代码点 0641、064f、0635、0652、062d、064e、0649(在 UTF8 中编码为 d981、d98f、d8b5、d992、d8ad、d98e、d989)并得到了,我猜, 14 个代码点 00d9 0081, 00d9, 008f, 00d8, 00b5, 00d9, 0092, 00d8, 00ad, 00d9, 008e, 00d9, 0089(其中一些不可打印,这就是为什么它看起来只有 8 个字符)。换句话说,这些字符首先被正确转换为 UTF-8,然后又出现了另一位软件,将编码的每个字节视为 8 位 ISO 8859-1 字符,并将它们转换为 unicode 代码点(或 utf- 16 或 ucs2 编码)。 请注意这个问题:***.com/questions/12512687/sql-server-utf8-howto,这意味着如果您使用的是 SQL Server 2008,那么您将陷入困境。 感谢您的见解。我正在使用 SQL Server 2012(谢天谢地)我在 hibernate 上添加了一堆调试,看看它是否真的在我认为它坏的地方坏了。我转回我的 Oracle DB 以消除更多的代码路径。我正在归零!【参考方案2】:

所以我在最初的问题中遗漏了一件事。

我在过滤器链中使用 Spring Security 和 CharacterEncodingFilter 设置了系统,以在所有请求和响应中强制使用 UTF-8,但我在我的 web 安全初始化程序的 afterSpringSecurityChain 部分设置了它。

我将过滤器移到 beforeSpringSecurityChain 方法中,然后繁荣 - 所有 UTF-8 都与所有数据库供应商完美兼容。

我最终没有向我的连接字符串或任何东西添加任何参数。这实际上只是我更改的过滤器。

【讨论】:

***.com/a/34836332/6460660 这可能有助于设置属性

以上是关于Hibernate + JPA + jTDS + SQL Server = Unicode 问题的主要内容,如果未能解决你的问题,请参考以下文章

jTDS 提交语句在 MSSQL 2008 中关闭未结束事务

jTDS - 运行 Maven 构建项目时没有合适的驱动程序异常

hibernate jpa 报错

JPA(Hibernate)

spring.jpa.hibernate.hbm2ddl 和 spring.jpa.hibernate.ddl 之间的区别

JPA和Hibernate的关系