【发布时间】:2018-01-03 21:00:29
【问题描述】:
我正在使用带有 JPA 2.0 的 Spring 4.3.1 并连接到 MSSQL。我正在使用 JpaRepository 的保存方法来插入和更新数据。其中一个字段具有 nvarchar,它可以包含拉丁文、中文等特殊字符。
另外,我在 applicationContext-hibernate.xml 中设置了以下 JPA 属性。
<prop key="hibernate.connection.CharSet">UTF-8</prop>
<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF-8</prop>
当我保存数据时,所有特殊字符都保存为问号(??)。 建议的解决方案是在更新查询前附加“N”以保留插入的特殊字符。但是,我在任何地方都看不到如何在 JpaRepository 的保存方法中附加“N”。有什么建议么?
【问题讨论】:
-
可能有助于使用
UTF16? SQL-Server 的VARCHAR数据类型不是UTF-8,而是一种扩展ASCII(取决于COLLATION)。并确保使用NVARCHAR列作为目标。如果将其存储到VARCHAR列中,也会得到问号。 -
如果我改为UTF16,其他字段也会受到影响吗?我会试试的。 JPA 中有没有办法在查询中指定在保存期间在数据前面附加 N?
-
SQL Server 根本不支持
UTF-8(好吧,最新版本支持UTF-8,但仅支持BULK加载...)。您发送到 SQL-Server 的任何字符串都将被视为 1-byte-encoded-extended-ASCII (VARCHAR) 或2-byte-enocded unicode / UTF-16 / UCS-2(NVARCHAR)。无论您使用哪种语言或工具与 SQL-Server 进行最佳通信,都应使用2-byte-unicode -
嗯。谢谢..这是否意味着在pojo中声明变量如下没有效果? Column(name="[CD Hours of Operation]", columnDefinition = "nvarchar") 我是否必须明确地将字符串转换为 2 字节 unicode?span>
-
对不起,这个我不知道...但是无论如何你应该transmitt把它作为2-byte-unicode而不是作为
UTF-8
标签: sql-server character-encoding jpa-2.0 spring-4