歡迎光臨
每天分享高質量文章

徹底解決 MySQL 中文亂碼

作者 :carl-zhao

來自:https://blog.csdn.net/u012410733/article/details/61619656


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 了


●編號371,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

Web開發

更多推薦18個技術類公眾微信

涵蓋:程式人生、演算法與資料結構、黑客技術與網絡安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

赞(0)

分享創造快樂