最近,我在作一個項目的部署,這個項目是已nginx爲前端代理兩個tomcat的節點,經過mysql-proxy代理訪問兩臺主從的mysql數據庫。前端
整個項目搭建部署完成,進行測試,發現打開網頁出現中文亂碼。好吧,我進行修改。mysql
開始覺得是mysql數據庫配置有問題,查看mysql的配置文件my.conf,內容以下:linux
[mysqld] datadir=/usr/local/mysql/data socket=/tmp/mysql.sock user=mysql skip-character-set-client-handshake init_connect='SET NAMES utf8' default-storage-engine=INNODB [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid default-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',我對配置文件就行更改nginx
[mysqld] datadir=/usr/local/mysql/data socket=/tmp/mysql.sock user=mysql skip-character-set-client-handshake init_connect='SET NAMES utf8' character_set_server=utf8 default-storage-engine=INNODB [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid default-character-set = utf8 [mysql] default-character-set = utf8 [mysql.server] default-character-set = utf8 [client] default-character-set = utf8
從新啓動mysql,登陸mysql數據庫進行查詢sql
查看默認字符集
數據庫
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-8 jdbc.username=username jdbc.password=password
發現jdbc的配置也是utf8,也沒有問題啊。tomcat
我檢查了tomcat的配置文件,覺得是server.xml文件忘記修改字符集,我打開server.xml文件,發現這配置以下:bash
<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,清除瀏覽器的緩存,再次訪問還有亂碼,在網頁進行更改後,發現數據庫的數據是正常的。訪問的到時候,有時候仍是會出現問號,不是亂碼。此次亂碼是解決了。
我朋友告訴我查看系統的字符集,我發現系統的字符集的好像有問題,
[root@scmysql ~]# locale LANG=zh_CN.UTF-8 LC_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= [root@scmysql ~]# echo $LANG zh_CN.UTF-8 [root@scmysql ~]# cat /etc/sysconfig/i18n LANG="zh_CN.UTF-8" [root@scmysql ~]#
在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/data socket=/tmp/mysql.sock user=mysql skip-character-set-client-handshake init_connect='SET NAMES utf8' character_set_server=utf8 default-character-set=utf8 default-storage-engine=INNODB [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid default-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這個才管用。
總結:
一、MYSQL亂碼的問題主要有幾個環節決定,一個是前端網頁;二是字符傳輸;三是鏈接MYSQL;四是MYSQL的存貯方式。
二、linux的要注意版本的區別。