mysql 中文支援
show variables like 'character%';
SHOW VARIABLES LIKE 'collation_%';
Java連線MySQL中文亂碼處理 http://developer.51cto.com 2009-06-19 14:54 楊志偉 CSDN 我要評論(0)
本文將為大家講解如何處理Java連線過程中的MySQL中文亂碼問題。一般MySQL中文亂碼問題都是與字符集有關,這裡作者的經歷也大致差不多。
MySQL預設編碼是latin1
mysql> show variables like 'character%'; +--------------------------+--------------------------+ | Variable_name | Value | +--------------------------+--------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | D:\MySQL\share\charsets\ | +--------------------------+--------------------------+ 建立資料表並插入資料15. mysql> use test; mysql> create table messages ( -> id int(4) unsigned auto_increment primary key, -> message varchar(50) not null -> ) engine=myisam default charset=utf8; mysql> insert into messages (message) values ("測試MySQL中文顯示"); mysql> select * from messages; +----+-------------------+ | id | message | +----+-------------------+ | 1 | 測試MySQL中文顯示 | +----+-------------------+ 編寫程式(Java) import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class JDBCTest { public static void main(String[] args) { String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "root"; try { Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); stmt.executeUpdate("insert into messages (message) values ('測試MySQL編碼')"); ResultSet rs = stmt.executeQuery("select * from messages"); while (rs.next()) { int id = rs.getInt("id"); String message = rs.getString("message"); System.out.println(id + " " + message); } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } 程式輸出 1 ????MySQL???????? 2 ??MySQL??
我們看到,儘管使用資料庫時我們能夠正常的新增和顯示中文,但是在使用程式連線資料庫時並不能夠正常顯示中文,為此我們需要修改MySQL的預設編碼,編輯my.ini(MySQL配置檔案)(如果是maria db ,配置檔案是 /etc/mysql/conf.d/mariadb.cnf)檔案對編碼進行修改
設定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的編碼有關
原文:http://hi.baidu.com/jsmlay/item/1f824518c8bf6d06e75c3637
注意如下:
遇到一個奇怪的mysql亂碼問題,我的mysql全部已經設定成了utf-8,sql-front中文顯示也是正常的,通過程式或者是FRONT都能夠查詢中文,就單單再mysql中是亂碼。 mysql> SHOW VARIABLES LIKE 'character_set_%'; -----------------------------+ | Variable_name | Value | +--------------------------+-------------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | C:\MySQL\MySQL Server 5.0\share\charsets\ | +--------------------------+-------------------------------------------+ 8 rows in set (0.06 sec) 看似都正常但是在mysql中執行select出來的中文都是亂碼,sql-front正常。
宣告:ITeye文章版權屬於作者,受法律保護。沒有作者書面許可不得轉載。 自己結貼,字元就算都轉成了UTF8但是控制檯的字元好像一定要GBK,不知道什麼原因我所有字元都是UTF8的但是要想不是亂碼一定要在控制檯中輸入set names gbk;這樣就不亂了,說實話很茫然。mysql命令列下:
安裝時是UTF8,my.ini下也改了。可使用show variables like 'character\_set\_%';檢視時,發現
character_set_database=labins,character_set_server=labins
檢視字符集 show variables like 'character\_set\_%';
修改字符集 set character_set_client=utf8;
MySQL字符集修改命令
1.修改伺服器級 a. 臨時更改: mysql>SET GLOBAL character_set_server=utf8; b. 永久更改:shell>vi /etc/my.cnf[mysqld]default-character-set=utf8
2.修改資料庫級 a. 臨時更改: mysql>SET GLOBAL character_set_database=utf8; b. 永久更改:改了伺服器級就可以了
3.修改表級 mysql>ALTER TABLE table_name DEFAULT CHARSET utf8; 更改了後永久生效
4.修改列級修改示例: mysql>ALTER TABLE `products` CHANGE `products_model` `products_model` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL; 更改了後永久生效 5.更改連線字符集 a. 臨時更改:mysql> SET NAMES utf8;b. 永久更改: shell>vi /etc/my.cnf在[client]中增加:default-character-set=utf8
set names gbk
jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf-8
reference documents
http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_character_set_filesystem
http://blog.sina.com.cn/s/blog_81547cad01014x0v.html
http://hatemysql.com/2011/05/17/mysql-character_sets_dir/