1. 程式人生 > >MySQL解決中文亂碼之全套方案

MySQL解決中文亂碼之全套方案

今天遇到一堆MySQL 中文亂碼的問題 ,總體來說分為資料庫層面,Tomcat層面,web表示層面。

資料庫層面

先是MySQL資料庫中文亂碼問題,大概樣子如下:

問號

然後自我感覺這件事情不就是改下欄位的編碼嗎,那就改一下唄 如圖,我更改了Encoding

欄位編碼

然後發現事情並沒有那簡單,於是開始上網查解決方案,網上說需要修改/etc/my.cnf(此配置檔案對於mac字尾是.cnf,對於Windows是.ini)。所以漫漫找尋之路開始了,最後連Linux查詢find語句也試了就是找不到,終於在幾篇文章裡查到Mac上的MySQL沒有my.cnf配置檔案,好吧,繼續尋找解決方案,有人說MySQL下的support-file中找一個.cnf

複製一下再改;裡面的東西,然而我連.cnf檔案都沒有找到。最後採用一位網友的辦法,直接在/etc目錄下 vim my.cnf新建一個檔案,在此附上我修改過的檔案裡面內容,在[mysqld] 之後增加了一行 collation-server = utf8_general_ci


# Example MySQL config file for medium systems.
  #
  # This is for a system with little memory (32M - 64M) where MySQL plays
  # an important part, or systems up to
128M where MySQL is used together with # other programs (such as a web server) # # MySQL programs look for option files in a set of # locations which depend on the deployment platform. # You can copy this option file to one of those # locations. For information about these locations, see: # http://dev.mysql.com/doc/mysql/en/option-files.html # # In
this file, you can use all long options that a program supports. # If you want to know which options a program supports, run the program # with the "--help" option. # The following options will be passed to all MySQL clients [client] default-character-set=utf8 #password = your_password port = 3306 socket = /tmp/mysql.sock # Here follows entries for some specific programs # The MySQL server [mysqld] character-set-server=utf8 default-storage-engine = INNODB collation-server = utf8_general_ci init_connect='SET NAMES utf8' port = 3306 socket = /tmp/mysql.sock skip-external-locking key_buffer_size = 16M max_allowed_packet = 1M table_open_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M character-set-server=utf8 init_connect='SET NAMES utf8' # Don't listen on a TCP/IP port at all. This can be a security enhancement, # if all processes that need to connect to mysqld run on the same host. # All interaction with mysqld must be made via Unix sockets or named pipes. # Note that using this option without enabling named pipes on Windows # (via the "enable-named-pipe" option) will render mysqld useless! # #skip-networking # Replication Master Server (default) # binary logging is required for replication log-bin=mysql-bin # binary logging format - mixed recommended binlog_format=mixed # required unique id between 1 and 2^32 - 1 # defaults to 1 if master-host is not set # but will not function as a master if omitted server-id = 1 # Replication Slave (comment out master section to use this) # # To configure this host as a replication slave, you can choose between # two methods : # # 1) Use the CHANGE MASTER TO command (fully described in our manual) - # the syntax is: # # CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>, # MASTER_USER=<user>, MASTER_PASSWORD=<password> ; # # where you replace <host>, <user>, <password> by quoted strings and # <port> by the master's port number (3306 by default). # # Example: # # CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306, # MASTER_USER='joe', MASTER_PASSWORD='secret'; # # OR # # 2) Set the variables below. However, in case you choose this method, then # start replication for the first time (even unsuccessfully, for example # if you mistyped the password in master-password and the slave fails to # connect), the slave will create a master.info file, and any later # change in this file to the variables' values below will be ignored and # overridden by the content of the master.info file, unless you shutdown # the slave server, delete master.info and restart the slaver server. # For that reason, you may want to leave the lines below untouched # (commented) and instead use CHANGE MASTER TO (see above) # # required unique id between 2 and 2^32 - 1 # (and different from the master) # defaults to 2 if master-host is set # but will not function as a slave if omitted #server-id = 2 # # The replication master for this slave - required #master-host = <hostname> # # The username the slave will use for authentication when connecting # to the master - required #master-user = <username> # # The password the slave will authenticate with when connecting to # the master - required #master-password = <password> # # The port the master is listening on. # optional - defaults to 3306 #master-port = <port> # # binary logging - not required for slaves, but recommended #log-bin=mysql-bin # Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = /usr/local/mysql/data #innodb_data_file_path = ibdata1:10M:autoextend #innodb_log_group_home_dir = /usr/local/mysql/data # You can set .._buffer_pool_size up to 50 - 80 % # of RAM but beware of setting memory usage too high #innodb_buffer_pool_size = 16M #innodb_additional_mem_pool_size = 2M # Set .._log_file_size to 25 % of buffer pool size #innodb_log_file_size = 5M #innodb_log_buffer_size = 8M #innodb_flush_log_at_trx_commit = 1 #innodb_lock_wait_timeout = 50 [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash # Remove the next comment character if you are not familiar with SQL #safe-updates default-character-set=utf8 [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149

此時儲存檔案,再修改檔案讀寫許可權,將許可權修改為664

sudo chmod 664 /etc/my.cnf
  • 1

之後再重啟MySQL和配置檔案就可以生效了。 然後完成之後,確實,如果你查一下MySQL的各種編碼,確實都變成了UTF-8 通過以下命令

查資料庫編碼

然而~輸入不了中文了,報錯

這裡寫圖片描述

最後將當前資料庫以及所有表所有欄位都設定為UTF-8

這裡寫圖片描述

驚喜的發現可以愉快的輸入中文了~~ 至此,資料庫層面告一段落

Tomcat層面

接下來我說的簡略一些,如果URL請求採取GET方法,那麼你的URL中可能會出現中文,所以需要在Tomcat配置檔案裡面設定編碼方式。

修改Tomcat下的conf/server.xml檔案,找到如下程式碼:

 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
  • 1
  • 2
  • 3

這段程式碼規定了Tomcat監聽HTTP請求的埠號等資訊。可以在這裡新增一個屬性:URIEncoding,將該屬性值設定為UTF-8, 即可讓Tomcat(預設ISO-8859-1編碼)以UTF-8的編碼處理get請求。更改後的程式碼如下所示:

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
              URIEncoding="UTF-8"
               redirectPort="8443" /> 
  • 1
  • 2
  • 3
  • 4

Web顯示層面

這裡主要針對請求為POST方法的時候,你需要設定web.xml 檔案,設定字串過濾器

<filter>
   <filter-name>characterEncodingFilter</filter-name>
   <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
   <init-param>
       <param-name>encoding</param-name>
       <param-value>UTF-8</param-value>
   </init-param>
   <init-param>
       <param-name>forceEncoding</param-name>
       <param-value>true</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>characterEncodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

最後如果你要回顯到頁面上列印中文的話需要設定一下response 如果你使用springMVC可以設定

@RequestMapping(value = "/XX.do", produces="text/html;charset=UTF-8")
  • 1