標籤:style blog http io ar color os 使用 sp
原文:sql點滴40—mysql亂碼問題總結
本文將為大家講解如何處理Java串連過程中的MySQL中文亂碼問題。一般MySQL中文亂碼問題都是與字元集有關,這裡作者的經曆也大致差不多。
MySQL預設編碼是latin1
1. mysql> show variables like ‘character%‘;
2. +--------------------------+--------------------------+
3. | Variable_name | Value |
4. +--------------------------+--------------------------+
5. | character_set_client | latin1 |
6. | character_set_connection | latin1 |
7. | character_set_database | latin1 |
8. | character_set_filesystem | binary |
9. | character_set_results | latin1 |
10. | character_set_server | latin1 |
11. | character_set_system | utf8 |
12. | character_sets_dir | D:\MySQL\share\charsets\ |
13. +--------------------------+--------------------------+
14. 建立資料表並插入資料
15. mysql> use test;
16. mysql> create table messages (
17. -> id int(4) unsigned auto_increment primary key,
18. -> message varchar(50) not null
19. -> ) engine=myisam default charset=utf8;
20. mysql> insert into messages (message) values ("測試MySQL中文顯示");
21. mysql> select * from messages;
22. +----+-------------------+
23. | id | message |
24. +----+-------------------+
25. | 1 | 測試MySQL中文顯示 |
26. +----+-------------------+
27. 編寫程式(Java)
28. import java.sql.Connection;
29. import java.sql.DriverManager;
30. import java.sql.ResultSet;
31. import java.sql.Statement;
32. public class JDBCTest {
33. public static void main(String[] args) {
34. String driver = "com.mysql.jdbc.Driver";
35. String url = "jdbc:mysql://localhost:3306/test";
36. String user = "root";
37. String password = "root";
38. try {
39. Class.forName(driver);
40. Connection conn = DriverManager.getConnection(url, user, password);
41. Statement stmt = conn.createStatement();
42. stmt.executeUpdate("insert into messages (message) values (‘測試MySQL編碼‘)");
43. ResultSet rs = stmt.executeQuery("select * from messages");
44. while (rs.next()) {
45. int id = rs.getInt("id");
46. String message = rs.getString("message");
47. System.out.println(id + " " + message);
48. }
49. rs.close();
50. stmt.close();
51. conn.close();
52. } catch (Exception e) {
53. e.printStackTrace();
54. }
55. }
56. }
57. 程式輸出
58. 1 ????MySQL????????
59. 2 ??MySQL??
我們看到,儘管使用資料庫時我們能夠正常的添加和顯示中文,但是在使用程式串連資料庫時並不能夠正常顯示中文,為此我們需要修改MySQL的預設編碼,編輯my.ini(MySQL設定檔)檔案對編碼進行修改
設定MySQL的預設字元集為utf8,找到用戶端配置[client]在下面添加。
default-character-set=utf8
找到伺服器配置[mysqld]在下面添加
default-character-set=utf8
設定MySQL資料庫以utf8編碼運行,串連MySQL資料庫時使用utf8編碼
停止和重新啟動MySQL
net stop mysql
net start mysql
//實際中,最新mySQL以上兩句已經失效,在命令列中先exit 然後重新登入可以實現這個目的
重新串連資料庫,查看編碼,資料表內容
1. mysql> show variables like ‘character%‘;
2. +--------------------------+--------------------------+
3. | Variable_name | Value |
4. +--------------------------+--------------------------+
5. | character_set_client | utf8 |
6. | character_set_connection | utf8 |
7. | character_set_database | utf8 |
8. | character_set_filesystem | binary |
9. | character_set_results | utf8 |
10. | character_set_server | utf8 |
11. | character_set_system | utf8 | //該行未更改,建議使用替換,這樣能改的全面
12. | character_sets_dir | D:\MySQL\share\charsets\ |
13. +--------------------------+--------------------------+
14. mysql> use test;
15. mysql> select * from messages;
16. +----+-------------------------------+
17. | id | message |
18. +----+-------------------------------+
19. | 1 | 虜芒脢脭MySQL脰脨脦脛脧脭脢戮 |
20. | 2 | ??MySQL?? |
21. +----+-------------------------------+
22. 這裡顯示依然是亂碼主要是因為之前使用的編碼不同造成的,重新運行之前寫的程式:java JDBCTest
23. 1 ????MySQL????????
24. 2 ??MySQL??
25. 3 測試MySQL編碼
26. 從第三條記錄我們可以看到現在程式串連資料庫時可以正常的添加和顯示中文了 //如果從MySQL command line中仍然查詢不到資料,顯示資料集為空白,繼續完成第三步使得系統的編碼和mySQL的編碼一致就可以查詢出來了……&
27. mysql> select * from messages;
28. +----+-------------------------------+
29. | id | message |
30. +----+-------------------------------+
31. | 1 | 虜芒脢脭MySQL脰脨脦脛脧脭脢戮 |
32. | 2 | ??MySQL?? |
33. | 3 | 嫻嬭瘯MySQL緙栫爜 |
34. +----+-------------------------------+
看回資料庫的顯示,我們會很奇怪的發現為什麼顯示的都是亂碼,這主要是和windows下命令列的編碼有關,在命令列上(命令提示字元左上方表徵圖處右鍵屬性)查看屬性->選項的當前字碼頁:936 (ANSI/OEM - 簡體中文 GBK)(本人機子上是這樣顯示的)
也就是說命令列上使用的是GBK編碼,而我們是在程式串連時使用utf8進行添加的,所以會出現有亂碼,現在我們將用戶端的編碼改成gb2312或gbk試一下
1. mysql> show variables like ‘character%‘;
2. +--------------------------+--------------------------+
3. | Variable_name | Value |
4. +--------------------------+--------------------------+
5. | character_set_client | gb2312 |
6. | character_set_connection | gb2312 |
7. | character_set_database | utf8 |
8. | character_set_filesystem | binary |
9. | character_set_results | gb2312 |
10. | character_set_server | utf8 | //最後你會發現這個還是沒有更改,見下文
11. | character_set_system | utf8 |
12. | character_sets_dir | D:\MySQL\share\charsets\ |
13. +--------------------------+--------------------------+
14. mysql> use test;
15. mysql> select * from messages;
16. +----+-------------------+
17. | id | message |
18. +----+-------------------+
19. | 1 | ????MySQL???????? |
20. | 2 | ??MySQL?? |
21. | 3 | 測試MySQL編碼 |
22. +----+-------------------+
補充:更改character_set_server,在安裝目錄的bin檔案夾下使用MySQLInstanceConfig.exe配置,在很多步驟中的一步(選擇編碼)選擇第二項(使用UTF-8)或者第三項(自己設定)……更改完畢……
現在可以看到中文正常顯示了(主要是因為utf8也支援中文),所以當我們使用命令列工具串連資料庫的時候最好將用戶端的編碼改一下,如果使用GUI的話就不必了,同時修改用戶端的編碼之後程式依然能夠正常顯示(以上兩點已經測試)
所以如果在程式中要顯示中文的話我們可以選用utf8,gb2312,gbk這三種編碼,但是如果想在命令列添加中文資料或者查看的話就需要將用戶端的編碼設定為gb2312或gbk了,還是那句,CMD的編碼有關
迷茫啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1.查詢編碼
show variables like ‘character%‘;
2.設定資料庫字元集
alter database moviesite character set utf8
3.設定表的字元集
alter table movie convert to character set utf8
4.不知道
set character_set_results=utf8
5.不知道
set character set utf8
6.不知道
set names ‘utf8‘
有時候這些都不管用,要設定成gbk或gb2312,好像沒什麼規律,我擦!。
php網頁出現亂碼一般是在建立資料庫時用的編碼和php網頁的編碼不同造成的,
用phpmyadmin建立的資料庫如果你不指定編碼他預設是latin1_swedish_ci 編碼,既瑞典語不區分大小寫,而我們中國做的網頁不是GBK就是GB2312編碼,這樣不出現亂碼才怪.
1,建立資料庫時指定編碼.
在此再嘮叨一下常用的編碼,免的新手又迷茫:
如果你做的是簡體中文網頁,那麼你在建立資料庫時用GB2312編碼,gb2312_chinese_ci.
如果你做的是繁體中文網頁,那麼你建立資料庫時要用gib5編碼, big5_chinese_ci
如果你做的網頁有簡體也有繁體中文,那麼推薦你用GBK編碼,gbk_chinese_ci . GBK包含的字碼比GB2312要多,當然繁體也在其中.
如果你做的是多國語言網頁,那麼推薦你用UTF-8編碼 . mysql中有二種utf8編碼可供選擇 : utf8_unicode_ci與utf8_general_ci 筆者一般用utf8_general_ci ,關於這二種編碼的區別,請參考本站的另一篇文章: Mysql中校對集utf8_unicode_ci與utf8_general_ci的區別
我們用UTF-8編碼為例建立資料庫:
2,用php串連資料庫時用mysq_query 設定一下編碼
文法: mysql_query("SET NAMES ‘utf8‘");
例如:
複製代碼代碼如下:$conn=mysql_connect(‘127.0.0.1‘,‘root‘,‘123456‘);
mysql_query("set names ‘utf8‘",$conn); //解決亂碼
mysql_select_db(‘test1‘,$conn);
一般情況下只要你做好了這二步,你的程式是不會出現亂碼的
二般情況:
二般情況一般出現的不多,多出現在做的程式語言比較多,比如有時做utf8的,有時做gb2312的,有時又要做big5的網頁,用IDE建立的.php檔案編碼和程式要顯示的編碼不同而引起的.
比如,我上次做了個gb2312的簡體中文網頁,現在老闆又有吩咐要做個gbi5網頁,但我的ide用的卻是gb2312的編碼
就拿我常用的IDE Dreamweaver來說吧
ide建立的網頁是gb2312,而我卻把建好的網頁改成big5的了,這樣怎麼會不出現亂碼呢,解決的方法很簡單,重新另存新檔一下,指定一下編碼就OK了,
如果還搞不定,那麼在網頁頭部加一行http頭資訊
header("Content-Type:text/html;charset=utf-8");
注意:在發送header頭資訊時header前面不可以有任何輸出,包括空格在內.
好了寫了這麼多,快看看你的程式屬於哪個情況引起的亂碼吧.
sql點滴40—mysql亂碼問題總結