弹簧数据 jpa utf-8 编码不起作用
Posted
技术标签:
【中文标题】弹簧数据 jpa utf-8 编码不起作用【英文标题】:spring data jpa utf-8 encoding not working 【发布时间】:2016-12-05 06:54:42 【问题描述】:我使用spring-data-jpa
和mysql
数据库。我的表格字符集是 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 编码不起作用的主要内容,如果未能解决你的问题,请参考以下文章