mysql使用utf8中文亂碼解決方案

來源:互聯網
上載者:User

標籤: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中文亂碼解決方案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.