彻底解决MySQL中文乱码

mysql是我们项目中非常常用的数据型数据库。但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况。下面就来介绍一下如何彻底解决数据库中文乱码情况。

1、中文乱码

1.1、中文乱码

create table user(name varchar(11));    # 创建user表
 insert into table user("carl");         # 添加数据
 select * from user;
insert into user value("哈哈");

无法插入中文字符:

1.2、查看表字符编码

mysql> show create table user \G;
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `name` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

我们可以看到表的默认字符集是latin1. 所以我们在创建表的时候就需要指定表的字符集:

create table user(name varchar(11)) default charset=utf8;

这样在Linux里面可以访问并且可以插入与访问这个表了。

1.3、数据库与操作系统编码

虽然在服务器端可以显示中文正常,但是在客户端可能会显示乱码。因为我们的服务器是UTF8。

而且数据库的编码也存在问题。

这里我们可以看character_sert_database与character_set_server的字符集都是latin1.那么在mysql数据库中,server,database,table的字符集都默认是latin1.下面我们就来看看如何解决mysql乱码情况。

2、mysql设置变量的范围

2.1、session范围

查看数据库编码:

show variables like '%char%';

修改字符编码:

set character_set_server=utf8;
set character_set_database=utf8;
show variables like '%char%';

我们可以看到字符集已经修改成都是utf8了。但是这里有一个问题,那就是我们重新打开一个命令窗口然后查看数据编码就会出现下面的画面:

2.2、global范围

mysql设置变量的范围默认是session范围。如果设置多个会话的字符集那么需要设置global范围:Set [global|session] variables …

set global character_set_database=utf8;
set global character_set_server=utf8;
show variables like '%char%';

当我们跨会话查看mysql字符集都会看到都是utf8。如果你以为万事大吉了的话,那么你就大错特错了。

2.3、设置数据全局范围

当我们数据库重启的时候,你们发现设置global范围的值又变成latin1了。

service mysqld restart
mysql -uroot -pyourpassword
show variables like '%char%';

不要怕,下面就教你终极大招:

修改mysql配置文件/etc/my.cnf。

[mysqld]
character-set-server=utf8 
[client]
default-character-set=utf8 
[mysql]
default-character-set=utf8

请注意这几个参数配置的位置,不然可能会启动不起来mysql服务:

OK。这下如果你重启mysql服务也会发现它的字符集是utf8.

而且我们创建表的时候不需要指定字符编码,它默认就是utf8;

drop database test;
create database test;
use test;
create table user(name varchar(11));
show create table user \G;

3、总结

我看网上很多答案都是直接在session级别设置mysql的字符编码,这是治标不治本的方法。我们还是要从源头上解决这个问题。那就是修改mysql默认的配置文件,把它的字符集修改成能够使用中文字符的UTF8就OK了。

原文:blog.csdn.net/u012410733/article/details/61619656

原文发布于微信公众号 - Java团长(javatuanzhang)

原文发表时间:2018-07-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构沉思录

如何优雅地实现分页查询

分页功能是很常见的功能,特别是当数据量越来越大的时候,分页查询是必不可少的。实现分页功能有很多种方式,如果使用的ORM框架是mybatis的话,有开源的分页插件...

1692
来自专栏铭毅天下

Elasticsearch 6.X 新类型Join深入详解

0、ES6.X 一对多、多对多的数据该如何存储和实现呢? 引出问题: “某头条新闻APP”新闻内容和新闻评论是1对多的关系? 在ES6.X该如何存储、如何进行高...

3.5K9
来自专栏FreeBuf

利用SQLite数据库文件实现任意代码执行

前言 近期,我们对贝尔金WeMo智能家居设备的安全性进行了分析。在研究过程中,我们开发出了一种新型的SQL注入技术,这项技术针对的是SQLite数据库。实验表明...

26010
来自专栏玩转全栈

Flutter中利用MapCache加sqflite实现一个伪LRU三级缓存

在做flutter应用的时候,遇到了一个问题,纯粹属于自己给自己加戏,问题是什么呢?我的app首页是一个列表,目前每次进应用,都是通过网络拿到新的列表,所以,如...

7625
来自专栏hbbliyong

ShellExecute 启动外部程序 参数详细介绍

ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。 目录 1基本简介 2...

53310
来自专栏社区的朋友们

MongoDb 简单介绍

最近一段时间使用 mongodb 做媒资数据的接入,简单介绍一下 mongodb 的特性和语法。希望对大家有所帮助。

1710
来自专栏进击的程序猿

orm 系列 之 Eloquent使用1

本文会是一个Eloquent的使用教程,在此之前,我们先讲述下怎么搭建环境,完整的系列请查看orm

762
来自专栏青玉伏案

Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)

前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架。本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在《Swift...

2397
来自专栏小樱的经验随笔

BugkuCTF SQL注入1

1814
来自专栏python3

pymysql--插入300万数据

        (2)使用python协程(遇到I/O操作就切换任务,无需等待--提高效率)

1692

扫码关注云+社区

领取腾讯云代金券