對於mysql數據庫而言,解決中文亂碼,能夠從兩個方向考慮,一個是經過修改mysql服務器端的配置文件/etc/mysql/my.cnf來支持中文,好比:mysql
... [mysql] default-character-set=utf8 ...
可是,修改配置文件須要重啓服務,尤爲是對於已經在線上運行的數據庫或者「老」的數據庫實例(有多是多實例或集羣)而言,顯然經過修改配置文件來操做是不適合的,甚至是不被DBA容許的,一般能想到的辦法是在客戶端或者JDBC鏈接時定製支持中文的編碼格式(一般使用UTF-8),這樣插入數據的時候,讓mysql爲自動爲咱們轉碼,可行的辦法有兩種:spring
一、若是是經過DriverManager.getConnection(url)編碼方式操做JDBC,能夠在JDBC的url中追加useUnicode=true&characterEncoding=UTF-8解決亂碼問題。sql
jdbc.url=jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=UTF-8
二、若是是經過其它數據源,好比DBCP、tomcat-jdbc、c3p0、spring-jdbc、hibernate讀取配置文件,在url中追加useUnicode=true&characterEncoding=UTF-8是不起做用的,而是經過數據源自身的配置生效,好比下列配置:數據庫
<!-- Tomcat data source --> <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="dbProperties"> <props> <prop key="useUnicode">yes</prop> <prop key="characterEncoding">utf8</prop> </props> </property> <!-- Configuration refer to optimizing connection performance --> <property name="initialSize" value="10" /> <property name="maxActive" value="100" /> <property name="maxIdle" value="50" /> <property name="minIdle" value="10" /> <property name="suspectTimeout" value="60" /> <property name="timeBetweenEvictionRunsMillis" value="30000" /> <property name="minEvictableIdleTimeMillis" value="60000" /> <property name="testOnBorrow" value="true" /> <property name="validationQuery" value="SELECT 1" /> <property name="validationInterval" value="30000" /> <!-- End Configuration refer to optimizing connection performance --> </bean>
其中:apache
<props> <prop key="useUnicode">yes</prop> <prop key="characterEncoding">utf8</prop> </props>
等價於url中的useUnicode=true&characterEncoding=UTF-8tomcat
查看當前數據庫的字符集(切換到某個數據庫先後比較):服務器
mysql> show variables like 'char_%'; +--------------------------+----------------------------+ | 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 | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) mysql> use robot_classifymark; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show variables like 'char_%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
能夠看到數據庫robot_classifymark採用的是utf8編碼的,正好對應建立數據庫時指定的編碼,對應建庫SQL:ui
CREATE DATABASE IF NOT EXISTS robot_classifymark DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
若是想在命令行下插入中文,能夠執行set names utf8,此命令會影響三個參數:this
mysql> show variables like 'char_%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) mysql> set names utf8 -> ; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'char_%'; +--------------------------+----------------------------+ | 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 | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
可見:執行命令set names utf8,影響了三個參數:character_set_client,character_set_connection,character_set_results,如此,能夠在當前命令行下插入中文了,可是,此命令只對當前命令行有效(*),若是想每次登入mysql命令行都生效,一樣須要修改mysql服務器端的配置文件/etc/mysql/my.cnf編碼
... [client] default-character-set=utf8 ...
因此,若是JDBC鏈接時,若是url未指定useUnicode=true&characterEncoding=UTF-8,能夠變相的經過每次執行insert或select語句以前先執行set names utf8來插入或查詢中文,顯然,此方式沒有在url中指定useUnicode=true&characterEncoding=UTF-8或者經過上面的數據源配置形式簡潔!