標籤:mysql亂碼的問題主要有幾個環節決定 一個是前端網頁;二是字元傳輸;三是串連mysql;四是mysql的存貯方式。
最近,我在做一個項目的部署,這個項目是已nginx為前端代理兩個tomcat的節點,通過mysql-proxy代理訪問兩台主從的mysql資料庫。
整個項目搭建部署完成,進行測試,發現開啟網頁出現中文亂碼。好吧,我進行修改。
開始以為是mysql資料庫配置有問題,查看mysql的設定檔my.conf,內容如下:
[mysqld]datadir=/usr/local/mysql/datasocket=/tmp/mysql.sockuser=mysqlskip-character-set-client-handshakeinit_connect=‘SET NAMES utf8‘default-storage-engine=INNODB[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.piddefault-character-set = utf8[mysql]default-character-set = utf8[mysql.server]default-character-set = utf8[client]default-character-set = utf8
我在網上尋找告訴我要在設定檔添加character-set-server=utf8和init_connect=‘SET NAMES utf8‘,我對設定檔就行更改
[mysqld]datadir=/usr/local/mysql/datasocket=/tmp/mysql.sockuser=mysqlskip-character-set-client-handshakeinit_connect=‘SET NAMES utf8‘character_set_server=utf8default-storage-engine=INNODB[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.piddefault-character-set = utf8[mysql]default-character-set = utf8[mysql.server]default-character-set = utf8[client]default-character-set = utf8
重新啟動mysql,登入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 | /usr/local/mysql-5.0.96-linux-x86_64-glibc23/share/mysql/charsets/ | +--------------------------+--------------------------------------------------------------------+8 rows in set (0.00 sec)mysql> show variables like ‘collation_%‘;+----------------------+-----------------+| Variable_name | Value |+----------------------+-----------------+| collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-----------------+3 rows in set (0.00 sec)mysql>
看到所有的字元集都是utf8,心想這次應該沒有問題了,結果開啟網頁還是出現亂碼,
查看jdbc的介面的配置,
jdbc.url=jdbc:mysql://mysqlproxy:3306/canyin_model?useUnicode=true&characterEncoding=utf-8jdbc.username=usernamejdbc.password=password
發現jdbc的配置也是utf8,也沒有問題啊。
我檢查了tomcat的設定檔,以為是server.xml檔案忘記修改字元集,我開啟server.xml檔案,發現這配置如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" maxThreads="1000" minSpareThreads="100" acceptCount="1000" maxConnections="1000" maxHttpHeaderSize="8192" tcpNoDelay="true" compression="on" compressionMinSize="2048" enableLookups="false" />
發現我已經設定ugf-8字元集啊,怎麼還是不對,看到這個結果一臉懵逼的樣子,哎,問題還是要解決的,我向我朋友請教,他告訴我要在設定檔中添加useBodyEncodingForURI="true"我也不知道啊這是幹啥的,在網上尋找才知道。
Tomcat7中,get與post的處理是分開的,對get請求使用URIEncoding進行處理,對post使用request.setCharacterEncoding()處理。在server.xml的Connector元素增加了以下配置參數:
URIEncoding:用來設定通過URI傳遞的內容使用的編碼,Tomcat將使用這裡指定的編碼對用戶端傳送的內容進行編碼。處理get請求使用該參數,預設使用iso-8859-1編碼。
useBodyEncodingForURI:使用與body一樣的編碼來處理URI。
好吧,對tomcat設定檔變更,
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true" URIEncoding="UTF-8" />
重啟tomcat,清除瀏覽器的緩衝,再次訪問還有亂碼,在網頁變更後,探索資料庫的資料是正常的。訪問的到時候,有時候還是會出現問號,不是亂碼。這次亂碼是解決了。
我朋友告訴我查看系統的字元集,我發現系統的字元集的好像有問題,
[[email protected] ~]# localeLANG=zh_CN.UTF-8LC_CTYPE="zh_CN.UTF-8"LC_NUMERIC="zh_CN.UTF-8"LC_TIME="zh_CN.UTF-8"LC_COLLATE="zh_CN.UTF-8"LC_MONETARY="zh_CN.UTF-8"LC_MESSAGES="zh_CN.UTF-8"LC_PAPER="zh_CN.UTF-8"LC_NAME="zh_CN.UTF-8"LC_ADDRESS="zh_CN.UTF-8"LC_TELEPHONE="zh_CN.UTF-8"LC_MEASUREMENT="zh_CN.UTF-8"LC_IDENTIFICATION="zh_CN.UTF-8"LC_ALL=[[email protected] ~]# echo $LANGzh_CN.UTF-8[[email protected] ~]# cat /etc/sysconfig/i18nLANG="zh_CN.UTF-8"[[email protected] ~]#
在LC_ALL這項為空白,就對系統字元集變更,
echo "export LANG=\"zh_CN.UTF-8\"export LC_ALL=\"zh_CN.UTF-8\"" >> /etc/profile source /etc/profile
在查看系統都是utf8格式的,心想現在應該沒有事了吧。開啟網頁,可以正常訪問,但是,還是出現問號,幾率還是比較大,再次尋找原因。我猜想是不是proxy出現問題,於是我將節點直接連接到mysql資料庫上,發現訪問的時候沒有問號出現。 但是proxy的配置沒有關於字元集的配置啊,這是我朋友問我用的資料庫的版本是多少,我告訴他mysql的版本為mysql-5.0.96。
於是告訴我查看mysql的設定檔,他看的我的設定檔,告訴我要在設定檔中的[mysqld]下加入default-character-set = utf8,更改內容如下:
[mysqld]datadir=/usr/local/mysql/datasocket=/tmp/mysql.sockuser=mysqlskip-character-set-client-handshakeinit_connect=‘SET NAMES utf8‘character_set_server=utf8default-character-set=utf8default-storage-engine=INNODB[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.piddefault-character-set = utf8[mysql]default-character-set = utf8[mysql.server]default-character-set = utf8[client]default-character-set = utf8
加上以後,再次訪問發現網頁不在出現問號。
到此,我這個項目的亂碼問題才算完美解決。
可為啥我配置的character_set_server=utf8不管用,而這default-character-set=utf8的配置管用嗎?
我在度娘上尋找,才明白。
原來在5.1版本時,為瞭解決中文亂碼問題設定預設字元集為utf8時,在my.ini內的 [mysql] 和 [mysqld] 項中都是寫:
default-character-set=utf8
到了5.5版本, [mysql] 項內可以這麼寫, [mysqld] 項內不能再這麼寫了,而是必須寫:
character-set-server=utf8
而我的mysql資料庫的版本為5.0的,所以只有配置default-character-set=utf8這個才管用。
總結:
1、MYSQL亂碼的問題主要有幾個環節決定,一個是前端網頁;二是字元傳輸;三是串連MYSQL;四是MYSQL的存貯方式。
2、linux的要注意版本的區別。
本文出自 “孫濤” 部落格,謝絕轉載!
mysql使用utf8中文亂碼解決方案