弹簧数据 jpa utf-8 编码不起作用

Posted

技术标签:

【中文标题】弹簧数据 jpa utf-8 编码不起作用【英文标题】:spring data jpa utf-8 encoding not working 【发布时间】:2016-12-05 06:54:42 【问题描述】:

我使用spring-data-jpamysql 数据库。我的表格字符集是 utf-8。我还在 application.properties 文件中添加了?useUnicode=yes&characterEncoding=utf8 到mysql url。当我将“ąčęėį”之类的字符传递给控制器​​以将其保存在 mysql 中时出现问题。在mysql中我得到了???分数。但是当我使用 mysql 控制台示例update projects_data set data="ąęąčę" where id = 1; 时,每个都运行良好。

application.properties:

# "root" as username and password.
spring.datasource.url = jdbc:mysql://localhost:3306/gehive?useUnicode=yes&characterEncoding=utf8
spring.datasource.username = gehive
spring.datasource.password = pass

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy


# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager)

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

表格:

+---------------+--------------------+
| TABLE_NAME    | character_set_name |
+---------------+--------------------+           
| customer      | utf8               |
| projects      | utf8               |
| projects_data | utf8               |
+---------------+--------------------+

【问题讨论】:

【参考方案1】:

试试

spring.datasource.url = jdbc:mysql://localhost:3306/gehive?useUnicode=yes&characterEncoding=UTF-8

问题似乎是由于缺少“-”。

参考:- https://forum.hibernate.org/viewtopic.php?f=1&t=1037497&view=next

【讨论】:

spring.datasource.url = jdbc:mysql://localhost:3306/project?useUnicode=yes&characterEncoding=UTF-8 不适合我。您能给我一个解决方案吗? 对于 spring mvc,jdbc:mysql://localhost:3306/project?useUnicode=true&characterEncoding=UTF-8 为我工作。【参考方案2】:

我遇到了同样的问题,我通过将此行添加到我的 application.properties 文件中解决了它:

spring.datasource.tomcat.connection-properties=useUnicode=true;characterEncoding=utf-8;

注意:以下没有工作:

spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;

【讨论】:

我已经完成了关于mysql配置文件或application.properties的配置。但是,当我添加该行时它会起作用。谢谢!【参考方案3】:

对于使用 HikariCP 连接池且不想将参数直接附加到 JDBC URL 的任何人:

spring.datasource.connectionProperties 属性已在不久前被删除。从那时起,您需要使用连接池特定的属性,如@SebTheGreat 的回答所示: spring.datasource.tomcat.connection-properties=useUnicode=true;characterEncoding=utf-8;

Hikari 没有 connection-properties 属性,但这有效:

spring.datasource.hikari.data-source-properties.useUnicode=true
spring.datasource.hikari.data-source-properties.characterEncoding=UTF-8

【讨论】:

救命稻草。当您在 Spring Boot 上添加 Hikari 的连接池属性时,这些似乎是必要的。谢谢! 这对我有用:spring.datasource.tomcat.connection-properties=useUnicode=true;characterEncoding=utf-8; 为我工作 - 当使用带有 spring boot 和 Hikari 连接池的外部 tomcat 时!【参考方案4】:

请记住转义任何特殊字符,如下所示: spring.datasource.url=jdbc\:mysql\://localhost\:3306/$SERVER_DB_NAME\?useUnicode=true\&characterEncoding=utf\-8\&characterSetResults=utf\-8

【讨论】:

它只是给出了错误,正如预期的那样。它不正确,只是破坏了应用程序配置 SERVER_DB_NAME 是一个环境变量,以防万一您不清楚。【参考方案5】:

就我而言,这解决了我的问题 https://mathiasbynens.be/notes/mysql-utf8mb4

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

【讨论】:

【参考方案6】:

如果使用 mysql java 连接器版本 5.1.44,它对我有用(在我使用连接器 8.0.17 之前它不起作用)

【讨论】:

【参考方案7】:

根据您的配置,另一种可能的解决方案是使用@SqlConfig annotation

@Sql(config = @SqlConfig(encoding = "utf-8"))

【讨论】:

以上是关于弹簧数据 jpa utf-8 编码不起作用的主要内容,如果未能解决你的问题,请参考以下文章

禁用弹簧安全不起作用[重复]

弹簧靴。 CORS。 'allowCredentials = false' 不起作用

为啥弹簧测试失败,不起作用@MockBean

弹簧注释不起作用

弹簧自动装配在非弹簧管理类中不起作用

弹簧自动装配不起作用[重复]