docker - mysql - utf8 中文編碼問題

手把手教你如何在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 的一些技巧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章