溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何終結(jié)mysql中文亂碼

發(fā)布時(shí)間:2021-11-17 09:30:19 來(lái)源:億速云 閱讀:115 作者:柒染 欄目:MySQL數(shù)據(jù)庫(kù)

本篇文章給大家分享的是有關(guān)如何終結(jié)mysql中文亂碼,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

我自己都不知道為了中文問(wèn)題煩惱了多少個(gè)日子,最恨瑞典人了-誰(shuí)叫他發(fā)明了mysql,還設(shè)置了默認(rèn)設(shè)置:latin1.曾經(jīng)也在想假如中國(guó)人發(fā)明了 mysql(my see狗),呵呵,那么我們還有這樣煩惱嗎?默認(rèn)的就是gk2312 或者gbk.倘若考慮到臺(tái)灣朋友加一個(gè)big5.就得了??墒悄??事實(shí)不是這樣的,沒(méi)有辦法,自己只好baidu一下,google一下,甚至yahoo 一下。能找到的方法都試過(guò)了,好久了,直到今天讓我找到了,想明白了。所以急切和大家分享以下心得。
 為了說(shuō)的明白一些,我覺(jué)個(gè)例子:
很簡(jiǎn)單,就是從html中接受兩個(gè)輸入,然后由jsp處理寫(xiě)到mysql且從數(shù)據(jù)庫(kù)返回這個(gè)結(jié)果顯示出來(lái)。
Mysql_jstl.html

<html>
<head>
 <title>CH14 - Mysql_jstl.html</title>
<meta http-equiv="Content-Type" content="text/html; charset= GB2312">
</head>
<body>

<h3>將信息存入 Mysql 中 - 使用 JSTL 寫(xiě)法</h3>
<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" %>
<%@ 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>

<h3>將信息存入 Mysql 中 - 使用 JSTL 寫(xiě)法</h3>

<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>


接下來(lái)就是創(chuàng)建數(shù)據(jù)庫(kù),名字為sample

然后建立一個(gè)table: employee,
內(nèi)容如下(其中應(yīng)該是email,可是我不小心在建數(shù)據(jù)庫(kù)打錯(cuò)了,將錯(cuò)就錯(cuò)了如何終結(jié)mysql中文亂碼):

+-------------+------------------+------+-----+---------+----------------+
| 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    |                |
+-------------+------------------+------+-----+---------+----------------+

如果只是這樣的話,就會(huì)出現(xiàn)這樣的錯(cuò)誤:報(bào)告的錯(cuò)誤是:sqle=com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long
for column 'last_name' at row 1
從 employee!
有的情況是:| name        |
+-------------+
| ??          |
| 54243654321 |
| ??          |
| ??          |
+-------------+出現(xiàn)問(wèn)號(hào)!

前面我們已經(jīng)說(shuō)過(guò)了,mysql默認(rèn)的編碼是latin1,不是我們所需要的gbk,所以我們要修改成為utf8,因?yàn)槿粢_顯示中文繁、簡(jiǎn)、日文、韓文 使用utf8,修改方法如下:
 ALTER DATABASE sample ####這里修改整個(gè)數(shù)據(jù)庫(kù)的編碼
      CHARACTER SET utf8
      DEFAULT CHARACTER SET utf8
      COLLATE utf8_general_ci
      DEFAULT COLLATE utf8_general_ci;

當(dāng)然了,你也可在在建數(shù)據(jù)庫(kù)的時(shí)候指定編碼,比如:

CREATE DATABASE sample

      CHARACTER SET utf8
      DEFAULT CHARACTER SET utf8

      COLLATE utf8_general_ci
      DEFAULT COLLATE utf8_general_ci ;

接下來(lái)要做的是打開(kāi)mysql所在的目錄下的my.nin

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:MySQLMySQL Server 5.0sharecharsets |
+--------------------------+-------------------------------------------+

mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database   | utf8_general_ci   |
| collation_server     | utf8_general_ci   |
+----------------------+-------------------+



接著你再看看執(zhí)行那個(gè)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 |
+-------------+-----------+------------+------------+------+--------------+

這當(dāng)然不是我們希望看到的,我們需要的現(xiàn)實(shí)完美正確的中文:
我們還有最后一招:
mysql> SET NAMES 'gbk' ;
Query OK, 0 rows affected (0.00 sec)
因?yàn)槲覀冃枰氖莋bk.
看看mysql中的character設(shè)置情況:

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:MySQLMySQL Server 5.0sharecharsets |
+--------------------------+-------------------------------------------+
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 |
+----------------------+-----------------+

這個(gè)才是我們最終需要的。
在來(lái)查看執(zhí)行完Mysql_jstl.jsp后的數(shù)據(jù)庫(kù)中的結(jié)果:
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 |
+-------------+-----------+------------+------------+------+--------------+

可以高興得看到了中文,并且在瀏覽器中也顯示正確。

但是僅僅這樣的話,當(dāng)你重新啟動(dòng)mysql的時(shí)候
所有的設(shè)置又失效了。
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:MySQLMySQL Server 5.0sharecharsets |
+--------------------------+-------------------------------------------+

mysql> SHOW VARIABLES LIKE '%collation%' ;
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database   | utf8_general_ci   |
| collation_server     | utf8_general_ci   |
+----------------------+-------------------+
重新讀取又出現(xiàn)亂碼:
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
+-------------+-----------+------------+------------+--
所以我們需要在客戶(hù)端設(shè)置系統(tǒng)能識(shí)別中文的編碼gbk并沒(méi)有保存到my.ini文件中。所以要修改my.ini文件

在[mysql]段加入一下代碼改成:default-character-set=gbk 這樣設(shè)置就得到保存了。
重啟就可以了。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:MySQLMySQL
+--------------------------+----------------
mysql> SHOW VARIABLES LIKE '%collation%' ;
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | gbk_chinese_ci  |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+

以上就是如何終結(jié)mysql中文亂碼,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI