手把手教你如何在mysql 中使用中文编码

1.首先在docker中拉取好一个最新的mysql镜像以后,创建一个容器:

docker run  -d -p 13306:3306 -e MYSQL_ROOT_PASSWORD=xxxxxx--name MYDB mysql
 
  • 1

参数的解释:

  • -d 设置detach为true
  • -p port 映射端口 13306
  • -e environment 设置密码 xxxxx

2. docker ps 查看mysql容器是否启动,进去容器

docker exec -ti xxx(容器id) /bin/bash
 
  • 1

理论上应该启动正常 进去容器内部

3.查看mysql密码 是否正常

mysql -u root -p
 
  • 1

在提示下输入密码 xxxxx 正常情况下,应该出现以下提示符mysql>

!!重点来了!!

1.前期工作 查看当前mysql字符集情况

mysql>SHOW VARIABLES LIKE 'character_set_%';//查看数据库字符集
 
  • 1

基本上都如下图所示:默认就是瑞典latin1

 SHOW VARIABLES LIKE 'collation_%';
 
  • 1


图上的第一个 connection 就是我们通过workbench等客户端连接的时候指定的编码。
外部访问数据乱码的问题就出在这个connection连接层上

1.先解决外部访问数据乱码的问题

SET NAMES 'utf8';
 
  • 1

它相当于下面的三句指令:

SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
 
  • 1
  • 2
  • 3

2.创建数据库,创建表的时候,包括设置字段的时候也要加上字符集设置:

例如

create database MYDB character set utf8;

use JSPDB;
create table t_product( pid varchar(20), pname varchar(20), price double, address varchar(30) ) DEFAULT CHARSET=utf8;

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3.如果你应经有建立了数据库,也可以通过以下语句修改字符集

当然 如果是刚刚建容器的时候 我想你肯定是没有数据库的,所有此步跳过

alter database name character set utf8;#修改数据库成utf8的.
alter table type character set utf8;#修改表用utf8.
alter table type modify type_name varchar(50) CHARACTER SET utf8;#修改字段用utf8
 
  • 1
  • 2
  • 3

4.这一步是很重要的来修改配置文件

mysql容器的配置文件在哪呢?
我们进去容器。不输入mysql -u root -p(即登录数据库)
配置文件在/etc/mysql/mysql.conf.d/mysqld.cnf这个文件里头

我们找到这个文件 编辑他vim mysqld.cnf,在使用docker容器时键入vim命令时提示:
vim: command not found
这个时候就需要安装vim
这时候需要敲:

apt-get update
 
  • 1

等更新完毕以后再敲命令:

apt-get install vim
 
  • 1

然后你发现vim 编辑器可以使用以后,在此文件中添加如下字段

在 [mysqld] 标签下加上两行
default-character-set = utf8
character_set_server = utf8

在 [mysqld] 标签下加上一行

character_set_server = utf8

在 [mysql] 标签下加上一行
default-character-set = utf8

在 [mysql.server]标签下加上一行
default-character-set = utf8

在 [mysqld_safe]标签下加上一行
default-character-set = utf8

在 [client]标签下加上一行

default-character-set = utf8

修改结果如下:

那么如何检验成功了呢?

还记得我们怎么检查mysql字符集编码的吗 ?

SHOW VARIABLES LIKE 'character_set_%';
 
  • 1



我们发现有很多都变成utf8了

 SHOW VARIABLES LIKE 'collation_%';
 
  • 1



以上基本的工作都做完了。

那么现在让我们建一个表,看看是否可以读取写入中文了吧!!

咚!!首先我使用的是mysql-workbench客户端

我解释一下:

  • connection name:连接名字随便起,这个无所谓
  • hostname:是你的ip地址,如果你是云服务器,你填上自己的公网地址就行(我是某云)
  • port:记得填上你的映射端口号 比如我们例子使用的是:13306
  • username :是root
  • password:你可以先输入上,如果不输入的时候,会提示你输入密码的

你会问哪来的用户和密码 ,你傻了,你创建容器的时候自己设置的,还记得吗?

docker run  -d -p 13306:3306 -e MYSQL_ROOT_PASSWORD=xxxxxx--name MYDB mysql
 
  • 1

好,以下是基本的建表啊,数据库啊的语句,我就不展开了,很容易上手!!

create database MYDB character set utf8;
 
  • 1
use MYDB;
create table t_product( pid varchar(20), pname varchar(20), price double, address varchar(30) ) DEFAULT CHARSET=utf8;

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
insert into t_product values ("A01","苹果",2.5,"yantai");
 
  • 1

后来 我尝试插入多条:

insert into t_product values ("A02","橘子",4.5,"yantai"), ("A03","香江",8.5,"rizhao"), ("A04","彩电",200,"japan"), ("A05","哈哈",13.5,"shandong"), ("A06","你好",8.5,"rizhao"), ("A07","手机",100,"japan"), ("A08","电视",13.5,"linyi"), ("A09","数数",4.5,"yantai"), ("A10","书店",8.5,"rizhao");
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然后你可以尝试将自己建好的表查看一下:

select * from t_product;
 
  • 1

这样就成功了!!!

如果你还不放心,我们可以尝试运行一个项目试一试哦!我这也不展开讲了!!
我自己的一个JSP项目运行截图:


新增:我在使用的过程中,发现在jsp的servlet中使用

ps = conn.prepareStatement("insert into emp(empno,ename,job,sal,deptno) values(?,?,?,?,?)");
 
  • 1

首先 我在数据库是事先插入的3条记录,都没有问题,然后再jsp中,明明插入的是中文,但是在数据库中显示乱码
我肯定是:JSP设置的出的问题

所以 我给每个servlet设置

request.setCharacterEncoding("UTF-8");
 
  • 1

但是并没什么卵用….
你可以试试….

方案1:

首先jsp页面设置编码设置为utf8
<%@ page language=”java” pageEncoding=”utf8”%>
接受对象是中文的时候对其处理
String str=new String(request.getParameter(“name”).getBytes(“ISO-8859-1”),”utf8”);

方案2:

连接数据库时候指定Encoding,我使用的是这个方法解决的
下面是连接数据库的两种不同形式:

DriverManager.getConnection("jdbc:mysql://localhost/SKDB?useUnicode=true&characterEncoding=utf8","root","xxxx");
 
  • 1
private static final String DRIVERNAME = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://123.207.149.102:4444/testjdbc?useUnicode=true&characterEncoding=utf8";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "xxxx";
    private static Connection conn = null;
 
  • 1
  • 2
  • 3
  • 4
  • 5

ok!!问题解决!!!

如果有任何问题,请联系我

参考文档:
文章1

文章2

文章3

参考:

  1. docker - mysql - utf8 中文编码问题
  2. docker中mysql数据库默认字符集修改
  3. docker mysql 修改默认编码为 utf8
  4. mysql字符编码的设置以及mysql中文乱码的解决方法
  5. 在 Docker 中使用 mysql 的一些技巧