2

我将我的 Web 应用程序上传到 CloudFoundry,但我的母语被破坏如下。

在此处输入图像描述

我检查了数据库是否有损坏的数据。

DB 使用 CloudFoundry 作为服务提供的 ClearDB MySQL 数据库。

我运行了以下查询。

SHOW VARIABLES LIKE 'c%'

character_set_client        utf8
character_set_connection    utf8
character_set_database      utf8
character_set_filesystem    binary
character_set_results       utf8
character_set_server        latin1
character_set_system        utf8
character_sets_dir          /usr/share/mysql/charsets/
collation_connection        utf8_general_ci
collation_database          utf8_general_ci
collation_server            latin1_swedish_ci
completion_type             NO_CHAIN
concurrent_insert           AUTO
connect_timeout             10

我怀疑“拉丁”部分是在猜测,但我不知道如何改变它。

有没有人可以帮助解决这个问题?

谢谢你。

4

1 回答 1

2

根据特定的 ClearDB 数据库服务器,在某些情况下,您的数据库的字符集是 latin1(MySQL 8.1 之前的默认配置)。

我们已经联系了 ClearDB 支持团队,但他们不愿意更改此配置,因为它可能会影响托管在同一服务器上的其他客户,并且他们为我们提供了一个更昂贵的解决方案:拥有我们自己的专用服务器。

优点是字符集可以根据连接基础进行配置,因此我们决定覆盖默认的 DataSource,它由 Cloud Foundry 使用的 Java buildpack 自动配置。

为了覆盖 DataSource,我们需要做几件事:

  1. 为 Spring Cloud 连接器添加 Maven 依赖项,
  2. 关闭 DataSource bean 的默认自动配置,
  3. 使用环境提供的连接参数配置 DataSource bean。

要添加 Spring Cloud 连接器,请将此依赖项添加到您的 pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cloud-connectors</artifactId>
</dependency>

为了关闭自动配置,请务必在 spring-boot cloud profile 中创建 Cloud bean:

@Configuration
@Profile("cloud")
public class DataSourceConfiguration {

    @Bean
    public Cloud cloud() {
        return new CloudFactory().getCloud();
    }
}

最后,要使用托管在 VCAP_SERVICES 环境变量中的数据库连接参数,您可以通过以下方式在 application-cloud.yml 中引用它们:

spring.datasource.url: ${cloud.services.mysql.connection.jdbcurl}&characterEncoding=utf-8
spring.datasource.username: ${cloud.services.mysql.connection.username}
spring.datasource.password: ${cloud.services.mysql.connection.password}
spring.datasource.testOnBorrow: true

在自定义 DataSource 配置时,请务必注意以characterEncoding=utf-8结尾的 spring.datasource.url :这是将连接配置为使用 UTF-8 编码的地方。

此外,在我们的例子中, mysql是 PCF 服务实例的名称,在您的环境中可能会有所不同。

最后,要了解更多关于使用 Spring Boot 绑定数据服务的信息,可以阅读这篇优秀的文章:https ://spring.io/blog/2015/04/27/binding-to-data-services-with-spring-boot -in-cloud-foundry

于 2019-06-22T15:54:18.973 回答