问题一、数据库中文乱码
现象: 插入中文数据到mysql后,发现乱码
解决方案: 设置数据库编码统一为utf8(因为utf8是3个字节,所以会有一定的空间损耗)
问题二、中文排序没有得到预期的排序结果
现象: 根据中文字段排序时,发现排序结果并不是按照首字母顺序的结果
原因:UTF8默认校对集是 utf8_general_ci , 它不是按照中文来的。
解决办案一:
- 可以自定义方言类,添加convert函数
package com.wd.cloud.wdtjserver.config;
import org.hibernate.dialect.*
import org.hibernate.type.StandardBasicTypes;
/**
* @author He Zhigang
* @date 2018/11/14
* @Description: 自定义数据库方言,支持中文排序
*/
public class MySQLDialect extends org.hibernate.dialect.MySQLDialect {
public MySQLDialect() {
super();
registerFunction("convert_gbk", new SQLFunctionTemplate(StandardBasicTypes.STRING, "convert(?1 using gbk)"));
}
/**
* 默认引擎为 MyISAMStorageEngine.INSTANCE
* @return
*/
@Override
protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
return InnoDBStorageEngine.INSTANCE;
}
}
- 指定方言为自定义的类
spring:
jpa:
database-platform: com.wd.cloud.wdtjserver.config.MySQLDialect
- 使用方法
@Query("FROM TjOrg order by convert_gbk(org_name) ASC")
List<TjOrg> getAllOrderByOrgName();
解决方案二:
直接修改该中文字段编码格式为GBK编码
ALTER TABLE tablename CHANGE column1 column2 VARCHAR(255) CHARACTER SET gbk;
tips: 注意column1 和 column2 表示将column1字段重命名column2,二者相同就不会对字段重命名了
网友评论