如何在 Spring 应用程序中使用嵌入式数据库 MariaDB 为数据库和表指定 utf8 编码?

How to specify utf8 encoding for db and tables, using embedded database MariaDB in Spring application?

开发网络应用程序我想使用嵌入式数据库来存储数据。但是,我更喜欢使用自定义数据库,而不是建议的内存数据库。我的选择是 MariaDB。 this 文章如何在我的项目中获取 MariaDB 作为嵌入式数据库,一切都很好,数据库出现了,除了一件事:我无法更改表值的编码。

我试图在我的 application.yml 文件中设置额外的应用程序属性,试图用指定编码的参数来完成连接字符串,但不幸的是所有这些都没有用:( 你们中有人遇到过这样的问题并且可以帮助我吗?提前致谢!

我目前的application.yml如下:

mariaDB4j:
  dataDir: ./localMariaDB
  port: 3307
  databaseName: embeddedDB
spring:
  datasource:
    url: jdbc:mariaDB://localhost:3307/
    username: root
    password:
    driver-class-name: org.mariadb.jdbc.Driver
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
      ddl-auto: create

最后我得到以下异常:

Caused by: java.sql.SQLException: Incorrect string value: '\xD0\x92 \xD1\x80\xD0...' for column 'current_status' at row 1
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readErrorPacket(AbstractQueryProtocol.java:1688) ~[mariadb-java-client-2.6.2.jar:na]
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1550) ~[mariadb-java-client-2.6.2.jar:na]
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1513) ~[mariadb-java-client-2.6.2.jar:na]
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:318) ~[mariadb-java-client-2.6.2.jar:na]
... 121 common frames omitted

顺便说一下,当我 运行 应用程序时,我得到的连接字符串看起来像 jdbc:mysql://localhost:3307/embeddedDB。 我很困惑为什么我的连接属性中指定的是 :mysql: 而不是 :mariadb:。它对我的数据库行为有影响吗?

所以,我找到了解决问题的方法。 它看起来像往常一样非常简单:) 要更改 MariaDB 提议的标准字符编码,我必须在设置 MariaDB 的 DataSource 之前指定其他配置属性。 由于 this 源提供配置 MariaDBSpringService 实体以在 DataSource 配置中进一步使用,因此有必要使用一些字符编码描述实用程序扩展它 (MariaDBSpringService)。因此,为了指定自定义编码(即更改标准编码),我刚刚将以下代码行添加到 MariaDBSpringService bean:

service.getConfiguration().addArg("--character-set-server=utf8mb4");
service.getConfiguration().addArg("--collation-server=utf8mb4_general_ci");

一般来说,完整的 bean 声明如下:

@Bean
public MariaDB4jSpringService mariaDB4jSpringService(){
    MariaDB4jSpringService service = new MariaDB4jSpringService();
    service.getConfiguration().addArg("--character-set-server=utf8mb4");
    service.getConfiguration().addArg("--collation-server=utf8mb4_general_ci");
    return service;
}

希望,这将对可能进一步面临此类问题的人有所帮助)) 感谢所有试图帮助我的人!