大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

MySql显示乱码的解决方法

昨天在SecureCRT(理解为一个ssh客户端,连接了公司的一台服务器),使用 /usr/bin/MySql 命令行查询 MySql,发现 MySql 表中的中文字符(UTF-8编码)在呈现的时候出现乱码,查询了一些资料,解决了这个问题,事后也让我意识到自己对于MySql只能说一知半解。联想到最近半年,一个老同事在微信上问了我好几次关于 MySql 主辅同步的问题,自己基于以前的理解,提供了一些建议,但客观的说,理论性的建议很容易提供,但自己却没有实践,总觉得有缺陷。

总之一句话,在 MySql 知识方面,自己是在啃老本,掌握的知识已经非常陈旧了。同时最近几年,公司的DBA团队越来越专业化了,对于开发人员来说,除了写一些 sql 语句,MySql 其他方面的知识可以说一无所知了。

而对于web开发人员来说,掌握一个数据库管理系统(比如 MySql)其实非常关键,直接影响找工作,所以下定决心准备系统学习一番,初步的规划就是:

  • 掌握SQL语言:SQL语言本质上和MySql是两码事,虽然现在web开发不建议使用复杂的 sql 操作(尤其查询),但掌握它就能更加专业化的使用SQL,最近参加DBAplus公众号的活动,拿到了一本书《sql进阶教程》,准备系统的看一看。
  • MySql索引优化、schema 设计:该部分对于web开发来说是最重要的,因为实际开发中用的最多,比如性能调优、设计库表结构,面试的时候经常会遇到相关问题。
  • 数据库管理:就是DBA做的那些事情,比如配置主辅同步、数据库文件拷贝、授权管理等等,掌握了它一方面对于理解MySql有好处,比如性能调优和硬件就有关联,另外一方面也能解决很多实际的问题,比如同事问我主辅同步延迟,如果完全没有实战配置过,根本不可能回答。
  • 为分布式系统学习做准备:MySql虽然是关系型系统,不属于分布式系统,但其中的一些概念(比如锁、并发)却和分布式息息相关,首先理解并在实战中理解他们,再去学习分布式就更得心应手了。

基于此,在后续的学习过程中,打算写一些MySql相关方面的文章,今天就练练手,说下是如何凭借现有知识解决 MySql 乱码的。

产生这个问题的根本原因在哪儿呢?一条规则:只要保证终端、执行 MySql 命令行的机器、MySql 命令行连接、MySql 服务器所用的编码都是 UTF-8,就能保证不会出现乱码。

首先,通过在 ssh 服务器上执行MySql命令行连接,然后输入下列命令:

MySql> show variables like '%character%';

输出:

| character_set_client     | latin1  |
| character_set_connection | latin1  |
| character_set_results    | latin1  |
| character_set_server     | utf8    |

说明MySql服务器库确实是 UTF-8 类型,存储的数据也是 UTF-8 类型(我知道表的设计 ),只是呈现出现问题,这说明可能和终端有关系,检查以下内容:

  • SecureCRT 终端配置的是 UTF-8。
  • SSH 服务器 locale 显示的也是 UTF-8。

这两项都没问题,那么 MySql 命令行查询所发送的字符集编码是什么呢,character_set_client 是 latin1,这就说明 MySql 命令行连接数据库的时候,用的编码是 latin1,它无法正确解析含有中文的 UTF-8 字符。

很明显了,如果 MySql 命令行连接MySql服务器,使用 UTF-8 字符集就不会有问题了,临时的解决方法很简单,进入 MySql 命令提示符,输入:

MySql> SET NAMES 'utf8';

这种方法虽然能够解决问题,但每次 MySql 命令行连接的时候,都要输入上述的命令,确实很麻烦,有没有一劳永逸的解决办法呢?

在我以前的印象中,MySql 命令行会读取一个 my.cnf 的文件,文件中包含连接过程中默认使用的一些参数,那么找到该文件,然后添加设置编码的参数(default-character-set)就能够解决问题,可我记不清该文件的位置了,最后根据以下步骤找到了:

# 查询MySql命令行是那个包安装的,输出MySql-5.1.73-5.el6_6.x86_64
$ rpm -qf /usr/bin/MySql 

# 查询MySql命令行包安装后的配置文件,输出为空
$ rpm -qc MySql-5.1.73-5.el6_6.x86_64

# 查询MySql命令行安装包依赖的包,重点关注 MySql-libs
$ rpm -qR MySql-5.1.73-5.el6_6.x86_64 

# 查询MySql-libs包安装后的配置文件,输出 /etc/my.cnf
$ rpm -qc MySql-libs

也就是说,MySql命令行引用的配置文件存储在 /etc/my.cnf 文件中,打开该文件,增加:

[client]
default-character-set=utf8

问题解决了,但属于被动式的解决方式,本质上还缺少对于 MySql 的理解,后面一篇,我会说说如何安装MySql服务器。


【这篇文章于2018-10-12号发表于公众号,地址https://mp.weixin.qq.com/s/tMMwwFts2_cT2bnvJGKZEA,也可以关注我的公众号(ID:yudadanwx,虞大胆的叽叽喳喳)】