萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql中文亂碼問題各種解決辦法

mysql中文亂碼問題各種解決辦法

mysql中文亂碼出現的方式各種各樣,如有中文顯示亂碼,讀出亂碼,寫入數據庫亂碼,導入中文亂碼等等各種各樣的問題,下面我來給大家介紹,解決mysql中文亂碼問題方法地,有需要了解的朋友可進入參考。

修改mysql配置解決亂碼

首先:

用show variables like “%colla%”;show varables like “%char%”;這兩條命令查看數據庫與服務端的字符集設置

如果查看出來都是gbk2312,或 gbk,那麼就只能支持簡體中文,繁體和一些特殊符號是不能插入的,我們只有修改字符集為UTF-8,

修改方法如下:

用記事本或UitraEdit打開mysql數據庫安裝目錄下的my.ini文件打開, 然後Ctrl+F搜索default-character-set,將後面的字符集修改為UTF8,注意要修改兩個地方,一個事客戶端的,一個是服務端的。

然後保存,重啟mysql服務、、進去繼續用show variables like “%colla%”;show varables like “%char%”;著兩條語句查詢一下字符集

數據表和連接部分的編碼設置

設置數據庫和數據表編碼

要解決亂碼問題,首先必須弄清楚數據庫和數據表用什麼編碼。如果沒有指明,將是默認的latin1。
用得最多的應該是這3種字符集 gb2312,gbk,utf8。
如何去指定數據庫和數據表的字符集呢?下面也gbk為例:
【在MySQL Command Line Client創建數據庫 】

 代碼如下 復制代碼

mysql> CREATE TABLE `mysqlcode` (
  -> `id` TINYINT( 255 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  -> `content` VARCHAR( 255 ) NOT NULL
  -> ) TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
  Query OK, 0 rows affected, 1 warning (0.03 sec)

其中後面的

 代碼如下 復制代碼 TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;

就是指定數據庫的字符集,COLLATE (校勘),讓mysql同時支持多種編碼的數據庫。
  當然也可以通過如下指令修改數據庫數據表的字符集:
   

 代碼如下 復制代碼  alter database mysqlcode default character set 'gbk'.

  前面已經設置了服務器、數據庫和數據表的編碼,那麼數據庫中的編碼便都是gbk,中文可以存儲進去。
但是如果你要通過執行insert或select等操作時,仍然會出現中文亂碼問題,這是因為還沒設置
“連接(connection)”部分的編碼,而insert、select等數據庫操作都包含與數據庫的連接動作。如果不信
,你現在可以執行下面的sql文試一試:

 代碼如下 復制代碼

mysql> insert into mysqlcode values(null,'java愛好者');

按回車,結果如下:

ERROR 1406 (22001): Data too long for column 'content' at row 1

  
設置連接編碼

設置了服務器、數據庫和數據表部分的編碼,必須設置連接編碼。連接編碼設置如下:

 代碼如下 復制代碼

mysql> SET character_set_client='gbk';
mysql> SET character_set_connection='gbk'
mysql> SET character_set_results='gbk'

設置好連接編碼,下面便可以成功插入中文了:

 代碼如下 復制代碼 mysql> insert into mysqlcode values(null,'java愛好者');
Query OK, 0 rows affected (0.02 sec)

  
其實,上面設置連接編碼的三條命令可以簡化為一條:
  

 代碼如下 復制代碼 mysql> set names 'gbk';
  

設置好了連接編碼後,在select查詢時,也能正確顯示中文:

 代碼如下 復制代碼

mysql> select * from mysqlcode;
+----+-----------+
| id | content |
+----+-----------+
| 1   | java愛好著 |
+----+-----------+
1 row in set (0.00 sec)


查詢mysql中文記錄亂碼問題

我們這裡以gb2312編碼亂碼為實例來介紹

如果你想使用gb2312編碼,那麼建議你使用latin1作為數據表的默認字符集,這樣就能直接用中文在命令行工具中插入數據,並且可以直接顯示出來.而不要使用gb2312或者gbk等字符集,如果擔心查詢排序等問題,可以使用binary屬性約束,例如:

 代碼如下 復制代碼

create table my_table ( name varchar(20) binary not null default'')type=myisam default charset latin1;

附:舊數據升級辦法
以原來的字符集為latin1為例,升級成為utf8的字符集。

原來的表:old_table (default charset=latin1),新表:new_table(defaultcharset=utf8)。


第一步:導出舊數據

 代碼如下 復制代碼

mysqldump --default-character-set=latin1 -hlocalhost -uroot -Bmy_db --tables old_table > old.sql

第二步:轉換編碼

 代碼如下 復制代碼

iconv -t utf-8 -f gb2312 -c old.sql > new.sql

在這裡,假定原來的數據默認是gb2312編碼。

第三步:導入

修改old.sql,增加一條sql語句: "SET NAMES utf8;",保存。

 代碼如下 復制代碼

mysql -hlocalhost -uroot my_db < new.sql

大功告成!!

mysql導入數據亂碼解決 

出現亂碼語句:mysql -hlocalhost -uroot -proot test<d:/test.sql

正確的語句:mysql -hlocalhost -uroot -proot test<d:/test.sql  --default-character-set=utf8

解決mysql導入導出數據亂碼問題

首先要做的是要確定你導出數據的編碼格式,使用mysqldump的時候需要加上--default-character-set=utf8,例如下面的代碼:

 代碼如下 復制代碼 mysqldump   -uroot  -p  --default-character-set=utf8   dbname tablename  >  bak.sql

那麼導入數據的時候也要使用--default-character-set=utf8:

 代碼如下 復制代碼

mysql -uroot -p --default-character-set=utf8 dbname < bak.sql

這樣統一編碼就解決了mysql數據遷移中的亂碼問題了

copyright © 萬盛學電腦網 all rights reserved