Spring boot SpringBoot2,Mysql UTF-8编码不工作

Spring boot SpringBoot2,Mysql UTF-8编码不工作,spring-boot,spring-data-jpa,Spring Boot,Spring Data Jpa,我在后端使用spring boot 2 jpa、mysql db,我有一些需要保存特殊字符的表字段。我尝试了很多方法,但都没有成功 它应该非常直接,我可以看到其他人是如何使用它,但出于某种原因,它不适合我 值Würtemberg像Wë½rtemberg 任何帮助都将不胜感激 以下是我尝试过但无法成功实现的方法 在application.properties中 方式1:- spring.datasource.url=jdbc:mysql://${global.database.host}:${gl

我在后端使用spring boot 2 jpa、mysql db,我有一些需要保存特殊字符的表字段。我尝试了很多方法,但都没有成功

它应该非常直接,我可以看到其他人是如何使用它,但出于某种原因,它不适合我

Würtemberg
Wë½rtemberg

任何帮助都将不胜感激

以下是我尝试过但无法成功实现的方法

在application.properties中

方式1:-

spring.datasource.url=jdbc:mysql://${global.database.host}:${global.database.port}/${global.database.schema}?useSSL=false&useUnicode=true&characterEncoding=UTF-8
方式2在上述url中使用Unicode=yes

方式3

spring.jpa.properties.hibernate.connection.CharSet=UTF-8
spring.jpa.properties.hibernate.connection.characterEncoding=UTF-8
spring.jpa.properties.hibernate.connection.useUnicode=true
方式4

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

但是运气不好

知道它为什么不起作用吗

我使用的数据源配置如下所示

@Slf4j
@Setter
@Configuration
public class DataSourceConfiguration {

    @Value("${spring.datasource.tomcat.test-on-borrow}")
    private boolean testOnBorrow;

    @Value("${spring.datasource.tomcat.validation-query}")
    private String validationQuery;

    @Value("${global.database.host}")
    private String dbHost;

    @Value("${global.database.port}")
    private Integer dbPort;


    @Bean
    @Primary
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    public DataSource dataSource() throws DockerException, InterruptedException {

        if (StringUtils.isEmpty(dbHost) || dbPort == null) {
            // some log
        } else {
            ServiceProbe probe = new ServiceProbe(2, TimeUnit.MINUTES);
            try {
                probe.probe(new IsTcpConnectionUp(dbHost, dbPort));
            } catch (ServiceDownException e) {
                throw new RuntimeException(e);
            }
        }

        DataSourceProperties dsp = dataSourceProperties();
        DataSourceBuilder dataSourceBuilder = dsp.initializeDataSourceBuilder();
        DataSource ds = dataSourceBuilder.build();


        if (ds instanceof org.apache.tomcat.jdbc.pool.DataSource) {
            ((org.apache.tomcat.jdbc.pool.DataSource) ds).setTestOnBorrow(testOnBorrow);
            ((org.apache.tomcat.jdbc.pool.DataSource) ds).setValidationQuery(validationQuery);
        } else {
            // some logs
        }
        return ds;
    }
}

这是一个很老的问题,所以我可能只是为了历史的缘故才发布解决方案

1) 数据库排序规则和表的字段排序规则应为utf8mb4_…,例如utf8mb4_unicode_ci

2) Application.properties连接字符串应包含:
useUnicode=true&characterEncoding=UTF-8


就像你的“方式1”。就是这样。

默认情况下,MySQL表字符集是拉丁文1。为了存储UTF-8字符,我们需要将表编码为UTF-8字符集


比如说<代码>更改表dbName.tableName修改列列名称长文本字符集utf8 COLLATE utf8\U general\U ci

检查mysql数据库排序规则。设置为utf8_bin@sajib我试过了,但没有成功:(谢谢你的回复
@Slf4j
@Setter
@Configuration
public class DataSourceConfiguration {

    @Value("${spring.datasource.tomcat.test-on-borrow}")
    private boolean testOnBorrow;

    @Value("${spring.datasource.tomcat.validation-query}")
    private String validationQuery;

    @Value("${global.database.host}")
    private String dbHost;

    @Value("${global.database.port}")
    private Integer dbPort;


    @Bean
    @Primary
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    public DataSource dataSource() throws DockerException, InterruptedException {

        if (StringUtils.isEmpty(dbHost) || dbPort == null) {
            // some log
        } else {
            ServiceProbe probe = new ServiceProbe(2, TimeUnit.MINUTES);
            try {
                probe.probe(new IsTcpConnectionUp(dbHost, dbPort));
            } catch (ServiceDownException e) {
                throw new RuntimeException(e);
            }
        }

        DataSourceProperties dsp = dataSourceProperties();
        DataSourceBuilder dataSourceBuilder = dsp.initializeDataSourceBuilder();
        DataSource ds = dataSourceBuilder.build();


        if (ds instanceof org.apache.tomcat.jdbc.pool.DataSource) {
            ((org.apache.tomcat.jdbc.pool.DataSource) ds).setTestOnBorrow(testOnBorrow);
            ((org.apache.tomcat.jdbc.pool.DataSource) ds).setValidationQuery(validationQuery);
        } else {
            // some logs
        }
        return ds;
    }
}