【问题标题】:Spring Boot 1.5.2 Hibernate - Cannot save non-ASCII character (µ) to postgresql properly?Spring Boot 1.5.2 Hibernate - 无法将非 ASCII 字符 (µ) 正确保存到 postgresql?
【发布时间】:2020-11-17 16:11:24
【问题描述】:

我有一个使用 Spring Boot 1.52 版本的 java web 应用程序,在 application.properties 文件中,我有这个配置来连接到 postgresql。

spring.datasource.url=jdbc:postgresql://localhost:5432/test_utf8

我有一个模型类,它代表 Hibernate 的一个表:

@Entity
@Table(name = "coverage")
@Inheritance(strategy = InheritanceType.JOINED)
public class Coverage implements Serializable {

    @Column(name = "metadata")
    @Lob
    private String metadata;

}

并且这个服务类将 Coverage 对象保存到数据库中。

@Transactional
public interface CoverageRepository extends CrudRepository<Coverage, String> {

}

我使用这个存储库服务将 Coverage 对象保存到数据库:

@Service
@Transactional
public class CoverageRepositoryService {

    @Autowired
    private CoverageRepository coverageRepository;

    public void save(Coverage coverage) {
       coverageRepository.save(coverage);
    }

}

一切都很好,除非元数据包含非 ascii 字符 µ。我检查了postgresql数据库,它将像这样\265保存,在Spring Boot Web应用程序中,它将显示为�字符。

Postgresql:

select encode(data, 'escape') from coverage c, pg_largeobject lo
where c.metadata::int=lo.loid

postgresql 中的表设置为 UTF-8:

psql (9.2.24)
Type "help" for help.

test_utf8=# SHOW SERVER_ENCODING;
 server_encoding 
-----------------
 UTF8
(1 row)

有谁知道,从 Spring Boot / Hibernate 将这个非 ascii 字符正确保存到 postgresql/ 会有什么问题

更新 1

如果我从 @Lob 中删除并更改为

@Column(name = "metadata", columnDefinition = "text")
private String metadata;

然后就可以在postgresql中很好的存储µ字符了

所以这个@Lob从Hibernate到Postgresql肯定有问题。

【问题讨论】:

    标签: java spring postgresql spring-boot hibernate


    【解决方案1】:

    我设法找到了问题所在。这是由于我的 java Web 应用程序的 pom.xml 文件中的 Postgresql JDBC 版本

        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.1-901-1.jdbc4</version>
        </dependency>
    

    Hibernate 的开发人员在很久以前从 Postgresql 发现了这个 JDBC 问题的历史原因:https://hibernate.atlassian.net/browse/HHH-6127

    然后,我只需要将 pom.xml 更新为:

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>
    

    然后它可以将非unicode字符正确保存到数据库。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2019-05-21
      相关资源
      最近更新 更多