解決MySQL中文亂碼的問題php
看到從數據庫中取出的數據所有是「?????」,太讓人鬱悶了。html
網上有不少方法來解決這個問題,能夠分爲二種,1是修改my.ini配置文件,若是是在網上的空間的話,咱們通常沒有權限去修改這個文件。java
我推薦使用使用第二種方法,在數據庫鏈接過程當中,設定字符編碼。mysql
以下所示:(加粗部分)sql
@ $db_link=mysql_connect('localhost','user','pass');
MySQL_query("SET NAMES 'utf8'");
mysql_select_db('databasename',$db_link);數據庫
方法二:轉自http://blog.chinaunix.net/space.php?uid=9195812&do=blog&id=2006339瀏覽器
爲了說的明白一些,我覺個例子:
很簡單,就是從html中接受兩個輸入,而後由jsp處理寫到mysql且從數據庫返回這個結果顯示出來。
Mysql_jstl.html
jsp
<html>
post
<head>
<title>CH14 - Mysql_jstl.html</title>
<meta http-equiv="Content-Type" content="text/html; charset= GB2312">
</head>
<body>
<h2>將信息存入 Mysql 中 - 使用 JSTL 寫法</h2>
<form name="form" action="Mysql_jstl.jsp" method="post" >
<p>姓:<input name="last_name" type="text" id="last_name"></p>
<p>名:<input name="first_name" type="text" id="first_name"></p>
<p>
<input type="submit" value="傳送">
<input type="reset" value="取消">
</p>
</form>
</body>
</html>
Mysql_jstl.jsp
<%@ page contentType="text/html;charset=GB2312" %>
ui
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>CH14 - Mysql_jstl.jsp</title>
</head>
<body>
<h2>將信息存入 Mysql 中 - 使用 JSTL 寫法</h2>
<fmt:requestEncoding value="GB2312" />
<c:set var="birth" value="1978/12/11" />
<c:set var="sex" value="F" />
<c:set var="email" value="aaa@asdf.com" />
<sql:setDataSource driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/sample?useUnicode=true&characterEncoding=UTF-8"
user="root"
password="44444" />
<sql:update>
INSERT INTO employee(employee_id, last_name, first_name, birth,sex, emmail)
VALUES ( ? , ? , ? , ? , ? , ? )
<sql:param value="${employee_id}" />
<sql:param value="${param.last_name}" />
<sql:param value="${param.first_name}" />
<sql:param value="${birth}" />
<sql:param value="${sex}" />
<sql:param value="${email}" />
</sql:update>
<sql:query var="result">
SELECT * FROM employee
</sql:query>
從 employee 取出全部新增的姓名:<br>
<c:forEach items="${result.rows}" var="row" >
新增姓名:<c:out value="${row.last_name}" />
<c:out value="${row.first_name}" /><br>
</c:forEach>
</body>
</html>
接下來就是建立數據庫,名字爲sample
而後創建一個table: employee,內容以下(其中應該是email,但是我不當心在建數據庫打錯了,將錯就錯了):
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| employee_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| last_name | varchar(20) | YES | | NULL | |
| first_name | varchar(20) | YES | | NULL | |
| birth | date | YES | | NULL | |
| sex | enum('m','f') | YES | | m | |
| emmail | varchar(39) | YES | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
若是隻是這樣的話,就會出現這樣的錯誤:報告的錯誤是:sqle=com.mysql.jdbc.MysqlDataTruncation:
Data truncation: Data too long
for column 'last_name' at row 1 .並且select last_name from employee.來看也出現了以下的狀況:| last_name |
+-------------+
| ?? |
| 54243654321 |
| ?? |
| ?? |
+-------------+出現問號!
前面咱們已經說過了,mysql默認的編碼是latin1,不是咱們所須要的gbk,因此咱們要修改爲爲utf8,由於若要正確顯示中文繁、簡、日文、韓文 使用utf8,修改方法以下:
ALTER DATABASE sample ####這裏修改整個數據庫的編碼
CHARACTER SET utf8
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci
DEFAULT COLLATE utf8_general_ci;固然了,你也可在在建數據庫的時候指定編碼,好比:
CREATE DATABASE sample
CHARACTER SET utf8
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci
DEFAULT COLLATE utf8_general_ci ;
接下來要作的是打開mysql所在的目錄下的my.nin
在[mysqld]段加入一下代碼改爲: default-character-set=utf8 啓動mysql,輸入: 執行下列語句,看看結果是否是下面的: mysql> show variables like '%character%'; +--------------------------+-------------------------------------------+ | Variable_name | Value | +--------------------------+-------------------------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_results | latin1 | | character_set_server | utf8 | character_set_system | utf8 | | character_sets_dir | C:\MySQL\MySQL Server 5.0\share\charsets\ | +--------------------------+-------------------------------------------+ mysql> show variables like '%collation%'; +----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | latin1_swedish_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-------------------+
接着你再看看執行那個Mysql.html 文件:這回你能夠看到的是
mysql> select * from employee;
+-------------+-----------+------------+------------+------+--------------+
| employee_id | last_name | first_name | birth | sex | emmail |
+-------------+-----------+------------+------------+------+--------------+
| 12 | ? | ?? | 1978-12-11 | f | aaa@asdf.com |
| 13 | ? | ?? | 1978-12-11 | f | aaa@asdf.com |
| 14 | ? | ?? | 1978-12-11 | f | aaa@asdf.com |
| 15 | ? | ?? | 1978-12-11 | f | aaa@asdf.com |
| 16 | ? | ?? | 1978-12-11 | f | aaa@asdf.com |
| 17 | ? | ?? | 1978-12-11 | f | aaa@asdf.com |
+-------------+-----------+------------+------------+------+--------------+
這固然不是咱們但願看到的,咱們須要的現實完美正確的中文:
咱們還有最後一招:
mysql> SET NAMES 'gbk' ;
Query OK, 0 rows affected (0.00 sec)
由於咱們須要的是gbk.
看看mysql中的character設置狀況:
mysql> SHOW VARIABLES LIKE '%character%' ;
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_results | gbk |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+-------------------------------------------+
7 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE '%collation%' ;
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | gbk_chinese_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
這個纔是咱們最終須要的。
在來查看執行完Mysql_jstl.jsp後的數據庫中的結果:
mysql> select * from employee;
| 14 | 王 | 彭給 | 1978-12-11 | f | aaa@asdf.com |
| 15 | 田 | 王光 | 1978-12-11 | f | aaa@asdf.com |
| 16 | 息 | 存入 | 1978-12-11 | f | aaa@asdf.com |
| 17 | 往 | 小杯 | 1978-12-11 | f | aaa@asdf.com |
+-------------+-----------+------------+------------+------+--------------+
能夠高興得看到了中文,而且在瀏覽器中也顯示正確。
可是僅僅這樣的話,當你從新啓動mysql的時候
全部的設置又失效了。
mysql> show variables like '%character%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+-------------------------------------------+
mysql> SHOW VARIABLES LIKE '%collation%' ;
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-------------------+
從新讀取又出現亂碼:
mysql> select * from employee;
+-------------+-----------+------------+------------+--
| employee_id | last_name | first_name | birth | s
+-------------+-----------+------------+------------+--
| 12 | ? | ?? | 1978-12-11 | f
| 13 | ? | ?? | 1978-12-11 | f
| 14 | ? | ?? | 1978-12-11 | f
| 15 | ? | ?? | 1978-12-11 | f
| 16 | ? | ?? | 1978-12-11 | f
| 17 | ? | ?? | 1978-12-11 | f
+-------------+-----------+------------+------------+--
因此咱們須要在客戶端設置系統能識別中文的編碼gbk並無保存到my.ini文件中。因此要修改my.ini文件
在[mysql]段加入一下代碼改爲:default-character-set=gbk 這樣設置就獲得保存了。 重啓就能夠了。mysql> show variables like '%character%'; +--------------------------+---------------- | Variable_name | Value +--------------------------+---------------- | character_set_client | gbk | character_set_connection | gbk | character_set_database | utf8 | character_set_results | gbk | character_set_server | utf8 | character_set_system | utf8 | character_sets_dir | C:\MySQL\MySQL +--------------------------+---------------- mysql> SHOW VARIABLES LIKE '%collation%' ; +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | gbk_chinese_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-----------------+