【问题标题】:MSSQL - JPA - Character encoding for Special characters - appending 'N' nativeQueryMSSQL - JPA - 特殊字符的字符编码 - 附加 'N' nativeQuery
【发布时间】: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


【解决方案1】:

将字段声明为 byte[] 数组,如下所示。

@Column(name="[colName]", columnDefinition = "nvarchar", length=4000)
    private byte[] colName;

并且在映射时,您必须使用 UTF-16 将 byte[] 转换为 String 可以达到以下目的。 从数据库(映射):

byte[] eCodeData = dbData.getColName();
            if(eCodeData != null){
                uiData.setColName(new String(eCodeData, StandardCharsets.UTF_16));
            }

到数据库:

String eCodeData = uiData.getColName();
        if(eCodeData != null){
            dbData.setColName(eCodeData.getBytes(StandardCharsets.UTF_16)); 
        }

就是这样。这会变魔术。

【讨论】:

    【解决方案2】:

    其实不用为字段定义byte[]数组而是

    @Column(columnDefinition = "nvarchar(255)")
    private String colName;
    

    够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 2016-10-19
      • 1970-01-01
      相关资源
      最近更新 更多