[轉]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/mysql.cnf這個文件里頭 
這里寫圖片描述

我們找到這個文件 編輯他vi mysql.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
  • 1
  • 2

在 [mysql] 標簽下加上一行

default-character-set = utf8
  • 1

在 [mysql.server]標簽下加上一行

default-character-set = utf8
  • 1

在 [mysqld_safe]標簽下加上一行

default-character-set = utf8
  • 1

在 [client]標簽下加上一行

default-character-set = utf8
  • 1

修改結果如下: 
這里寫圖片描述

那么如何檢驗成功了呢?

還記得我們怎么檢查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!!問題解決!!!

如果有任何問題,請聯系我

郵箱panpan668706@163.com!!! 
微信:panpan668706 
知乎:大牛帶我飛吧 
微信公眾號:大牛帶我飛吧

參考文檔:文章1 文章2 文章3

版權聲明:本文為博主原創文章,歡迎轉載,歡迎添加微信panpan668706交流經驗! https://blog.csdn.net/m0_37639542/article/details/72852875


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM