MySQL中文乱码解决方法(原创)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本人之前下载了一款用于可视化操作MySQL数据的软件 Navicat 8 for MySQL,挺好用的,顺便也可用于测试一下中文乱码问题是否解决分步骤进行一、设置字符集为UTF8首先,如果要在数据库中存储中文数据,个人建议将数据库的字符集设...
本人之前下载了一款用于可视化操作MySQL数据的软件 Navicat 8 for MySQL,挺好用的,顺便也可用于测试一下中文乱码问题是否解决

分步骤进行

一、设置字符集为UTF8
首先,如果要在数据库中存储中文数据,个人建议将数据库的字符集设置为utf8
当你调用CREATE DATABASE onedbname;时,MySQL会根据默认字符集来设置新建的数据库的字符集,所以为方便起见应该在建立数据库之前设置数据库的默认字符集
找到MySQL安装的目录(如E:\Program Files\MySQL\MySQL Server 5.1\),找到my.ini文件,进行如下修改(方法在网上搜的,测试成功):
    1、[mysql]下的
    default-character-set=latin1
    改为
    default-character-set=utf8
   
    2、[mysqld]下的
    default-character-set=latin1
    改为
    default-character-set=utf8
这样,就将MySQL数据库的默认字符集设置为utf8了

重新启动MySQL数据库,这个命令行命令不了解,我使用的方法如下:
控制面板->管理工具->服务,找到MySQL服务(若未找到,可以通过mysqld --install命令安装服务),结束掉,然后重新开启。

你可以用Navicat的可视化界面创建数据库,创建表,插入数据,你可以看到文本数据使用的是utf8编码,查看16进制数据,可以看到每个汉字占用3个字节(不知是否中文都如此)。

你也可以用mysql命令行创建数据库,创建表。当你执行一条插入命令带有中文时应该会出错!!!往下看!

二、命令行中插入与获取UTF8格式数据
进行了第一步的设置后,你执行如下命令
INSERT INTO tableName(id, lable) VALUES(100, '巨蚁很牛叉');
出错!你需要先执行下面一个命令
SET NAMES GBK;

之后重新执行一遍上面的语句,成功!
情感日志 www.lovewenzhang.com
根据我的思考,此处缘由应该是这样:
    MySQL不希望字符集问题给用户造成诸多不便,增加了一个将命令行的字符串转换为数据库所需字符集的字符串,比如我们一般在控制台输入的中文,一个字符都占用2个字节,通过SET NAMES GBK来说明我们的输入中含有中文需要进行相应转换。
    根据我刚刚对GBK编码的测试,我发现竟然和之前设置成UTF8的文本数据完全一样,在网上搜的GBK中文占用2字节,感觉甚是奇怪,究竟什么原因以后深入研究下应该可以明确。

上面的问题当你在执行SELECT语句时情况一样。
总之,当你要在命令行中处理有UTF8字符集的数据时,先调用一局SET NAMES GBK 就行了!

三、程序中处理插入与获取数据库中字符串数据
有一天夜里为在我的使用UNICODE的C++ WIN32控制台程序中显示中文,伤透了脑筋,之后第二天中午解决了,解决办法是我直接获取了UTF8字符数据,然后调用 MultiByteToWideChar(CP_UTF8, ...)转换为UNICODE字符串即可用_cwprintf进行显示。
如果要Insert中文数据的话,就不能直接传递字符串了,需要先将UNICODE字符串转换为UTF8格式的连续字节,然后发送命令的话传递一段连续的字节,应该有些麻烦。

现在可以采用第二步的方法,执行SQL命令 SET NAMES GBK,万事大吉,具体就不细说了,进行测试无误,不过对于UNICODE程序还是要进行相应的转换。

写了这么多,时间不早了,希望能给初使用MySQL的同行一些帮助...
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
关系型数据库 MySQL 数据库
MySQL忘记root密码、远程无法连接的解决方法
MySQL忘记root密码、远程无法连接的解决方法
|
1月前
|
关系型数据库 MySQL 索引
mysql8.0中fulltext不能查询到中文的解决方法
确保MySQL服务器字符集为`utf8mb4`,并设置`ngram_token_size=1`以支持单字搜索。如已更改此参数且存在全文索引,需删除原有索引并重建,使用`WITH PARSER ngram`指定解析器。例如: ``` ALTER TABLE your_table DROP INDEX idx_fulltext, ADD FULLTEXT INDEX idx_fulltext (your_column) WITH PARSER ngram; ```
|
1月前
|
存储 SQL 关系型数据库
|
29天前
|
SQL 存储 关系型数据库
MySQL主从同步延迟原因与解决方法
MySQL主从同步延迟原因与解决方法
49 0
|
4月前
|
SQL 关系型数据库 MySQL
mysql:1153 Got a packet bigger than ‘max_allowed_packet’ bytes的解决方法
mysql:1153 Got a packet bigger than ‘max_allowed_packet’ bytes的解决方法
56 0
|
4月前
|
SQL 关系型数据库 MySQL
mysql下出现Unknown column ‘xx‘ in ‘on clause‘的完全解决方法
mysql下出现Unknown column ‘xx‘ in ‘on clause‘的完全解决方法
201 0
|
2月前
|
关系型数据库 MySQL Linux
mysql超出最大连接数解决方法
以上就是解决MySQL超出最大连接数的方法,希望对你有所帮助。
35 1
|
3月前
|
SQL 关系型数据库 MySQL
MySQL密码修改的解决方法大全
MySQL密码修改的解决方法大全
|
4月前
|
关系型数据库 MySQL Java
启动项目出现com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException异常解决方法
启动项目出现com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException异常解决方法
|
4月前
|
关系型数据库 MySQL 数据库
navicat本地连接mysql出现1251--Client does not support authentication protocol requested by server的解决方法
navicat本地连接mysql出现1251--Client does not support authentication protocol requested by server的解决方法
404 0