我将我的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
我怀疑"拉丁语"的部分是在猜测,但我不知道如何改变它。
有人可以帮助解决这个问题吗?
谢谢。
根据特定的 ClearDB 数据库服务器,在某些情况下,数据库的字符集为 latin1(早于 8.1 的 MySQL 的默认配置)。
我们已经联系了 ClearDB 支持团队,但他们不愿意更改此配置,因为它可能会影响托管在同一服务器上的其他客户,并且他们为我们提供了一个更昂贵的解决方案:拥有我们自己的专用服务器。
好的一点是,字符集可以按连接基础进行配置,因此我们决定覆盖默认的数据源,该数据源由Cloud Foundry使用的Java构建包自动配置。
为了覆盖数据源,我们需要做几件事:
- 为Spring Cloud连接器添加Maven依赖项,
- 关闭数据源 Bean 的默认自动配置,
- 使用环境提供的连接参数配置数据源 Bean。
要添加 Spring Cloud 连接器,请将此依赖项添加到您的 pom .xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cloud-connectors</artifactId>
</dependency>
要关闭自动配置,请确保在 Spring 引导云配置文件中创建云 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
在自定义数据源配置时,重要的是要注意以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。