关于mysql中文编码的问题解决方案

2018-11-14  本文已影响7人  DimonHo

问题一、数据库中文乱码

现象: 插入中文数据到mysql后,发现乱码
解决方案: 设置数据库编码统一为utf8(因为utf8是3个字节,所以会有一定的空间损耗)

问题二、中文排序没有得到预期的排序结果

现象: 根据中文字段排序时,发现排序结果并不是按照首字母顺序的结果
原因:UTF8默认校对集是 utf8_general_ci , 它不是按照中文来的。

解决办案一:
  1. 可以自定义方言类,添加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;
    }
}
  1. 指定方言为自定义的类
spring:
  jpa:
    database-platform: com.wd.cloud.wdtjserver.config.MySQLDialect
  1. 使用方法
@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,二者相同就不会对字段重命名了

上一篇 下一篇

猜你喜欢

热点阅读