当前位置: 首页 > 知识库问答 >
问题:

Spring Boot 1.5.2 Hibernate-无法将非ASCII字符(µ)正确保存到postgresql?

郝杰
2023-03-14

我有一个使用Spring启动1.52版本的Java Web应用程序,并且在应用程序属性文件中,我有此配置连接到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靴/冬眠到正确保存这个非ascii字符到postgresql/

更新 1

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

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

然后它可以将µ字符精细存储在postgresql

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

共有1个答案

司毅庵
2023-03-14

我设法找到了问题。这是由于我的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字符正确保存到数据库中。

 类似资料:
  • 问题内容: 我正在尝试解析包含某些非ASCII字符的xml, 代码如下 但它在行“ content = …”上显示了错误,例如 在终端中它正在工作,但是在Eclipse IDE上运行时却给我一个错误。 不知道该如何克服。 问题答案: 您应该定义源代码编码,并将其添加到脚本顶部: 它在控制台和IDE中工作不同的原因可能是由于设置了不同的默认编码。您可以通过运行以下命令进行检查:

  • 问题内容: 我正在使用 mysql dbms存储来自Wikipedia的页面。我已使用指令在my.cnf文件中将字符集编码设置为(维基百科编码): 并使用属性定义创建了我的数据库。 我还通过以下方式更改了mysqld客户端的字符集编码: 在初始化我的jdbc驱动程序时插入属性。 进行查询 但是我注意到mysql服务器用其他字符替换了一些字符。 例如,它替换为。 更新 我已经运行的命令确保这两个和的

  • 我正在从Excel文档中提取文本并将它们作为id3标签添加到一些mp3文件中。我的Excel文档中的大多数字符是俄语(Unicode),但也有一些是英文的。当我运行脚本时,所有英文标签都被正确地写成元数据,但所有俄语字符都显示为问号。如果我在控制台中打印俄语字符,它们会完美地显示出来。为什么它们被写成问号?

  • 问题内容: 我在Matplotlib中显示非ASCII字符时遇到问题,这些字符呈现为小框而不是适当的字体,看起来像(我用红色油漆填充了这些框以突出显示它们): 我如何解决它? 一个相关的问题是 Matplotlib中的重音字符 。 问题答案: 实际上,此问题可能有两个不同的原因: 默认字体不包含这些字形 您可以使用以下方法更改默认字体(在完成任何绘制之前!) 在某些版本的matplotlib中,您

  • 问题内容: 在正则表达式中匹配非ASCII字符的最简单方法是什么?我想在输入字符串中单独匹配所有单词,但是语言可能不是英语,因此我需要匹配ü,ö,ß和ñ。另外,这是在Javascript/ jQuery中,因此任何解决方案都需要适用于此。 问题答案: 应该这样做: 它匹配ASCII字符集(0-127,即0x0至0x7F)中不包含的任何字符。 您可以使用Unicode执行相同的操作: 对于unico

  • 问题内容: 我正在使用从Excel导入一些数据的MySQL数据库。数据包含非ASCII字符(破折号等)以及隐藏的回车符或换行符。有没有办法使用MySQL查找这些记录? 问题答案: 这完全取决于您定义为“ ASCII”的内容,但是我建议尝试这样的查询变体: 该查询将返回columnToCheck包含任何非字母数字字符的所有行。如果还有其他可接受的字符,请将其添加到正则表达式中的字符类。例如,如果句点