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

问题一、数据库中文乱码

现象: 插入中文数据到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,二者相同就不会对字段重命名了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、引言 数据库设计过程中表、字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理...
    SnowflakeCloud阅读 41,119评论 0 48
  • 前段时间公司内部博客上凯哥分享了一篇关于mysql字符集编码的文章,之前我对mysql字符集一块基本没有深究过,看...
    __七把刀__阅读 6,506评论 14 18
  • 我是2016年3月份关注的小米姐,那时的我还是大三,在学校考驾照,自年初开始,感觉全国的房价一下都涨起来了,而一起...
    慢慢玉阅读 356评论 0 0
  • 回避型人格,又叫逃避型人格。 最怕与人争执,习惯了隐忍和退让,口头禅是“没事,没关系”。底线一退再退。 书上说,回...
    sunny小小静静阅读 216评论 2 2
  • 只因封面那一行字“一本所有女人都该读一读的书”就开始读了这本书,趁着还未上课赶紧先消遣消遣。 阿黛娜·海尔帕恩于我...
    当归姑娘2017阅读 1,029评论 0 1