`

mysql中文乱码终结

阅读更多
转自:http://blog.chinaunix.net/space.php?uid=9195812&do=blog&id=2006339

我自己都不知道为了中文问题烦恼了多少个日子,最恨瑞典人了-谁叫他发明了mysql,还设置了默认设置:latin1.曾经也在想假如中国人发明了 mysql(my see狗),呵呵,那么我们还有这样烦恼吗?默认的就是gk2312 或者gbk.倘若考虑到台湾朋友加一个big5.就得了。可是呢?事实不是这样的,没有办法,自己只好baidu一下,google一下,甚至yahoo 一下。能找到的方法都试过了,好久了,直到今天让我找到了,想明白了。所以急切和大家分享以下心得。

  为了说的明白一些,我觉个例子:
很简单,就是从html中接受两个输入,然后由jsp处理写到mysql且从数据库返回这个结果显示出来。
Mysql_jstl.html

<html>
<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" %>
<%@ 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 |+----------------------+-----------------+
也许写的很乱,你可以参考一下这里:中文乱码问题
或者参考我最新总结的:
Mysql中文乱码终结续篇
分享到:
评论

相关推荐

    mysql中文乱码问题

    MySQL 中文乱码问题解决方法 MySQL 是一个功能强大且广泛应用的关系型数据库管理系统,但是,在使用 MySQL 时,用户经常会遇到中文乱码问题。今天,我们将讨论在 MySQL 中的中文乱码问题,并提供解决方法。 MySQL...

    java插入mysql中文乱码解决

    ### Java插入MySQL中文乱码解决 #### 一、问题背景 在使用Java应用程序与MySQL数据库交互的过程中,常常会遇到一个令人头疼的问题:中文字符在存储到数据库时出现乱码现象。这种现象通常发生在使用JDBC(Java ...

    mysql汉字乱码问题

    5. **客户端配置**:确保连接MySQL的客户端工具(如MySQL Workbench, Navicat等)也使用正确的字符集。这通常在连接设置中进行。 6. **数据导入导出**:在导入或导出数据时,务必确保文件和数据库之间字符集的一致...

    解决 docker mysql 中文乱码问题

    使用 docker 启动 mysql 容器可能会出现中文乱码的情况,这里记录如何制作支持中文的 mysql 镜像 docker版本:18.06 mysql 版本:5.7 1. 创建 my.cnf 文件 [client] default-character-set=utf8 [mysql] default-...

    PHP+MySql中文乱码解决方案

    6. **PHP连接MySQL时指定的编码不正确**:在PHP脚本中连接MySQL时,如果没有正确指定编码,也会引起乱码问题。 #### 三、解决方案 针对以上提到的乱码原因,我们可以通过以下步骤来逐一解决: ##### 1. PHP网页的...

    解决C#操作Mysql时中文乱码问题(真的解决了)

    总的来说,解决C#操作MySQL中文乱码问题的关键在于保持从数据库配置到代码再到文件的整个过程中的编码一致性,使用UTF-8编码,并确保在每个环节都正确地指定和处理。通过以上步骤,你应该能够成功地避免中文乱码问题...

    Delphi2010解决ZEOSDBO-7.1.3a控件调用mysql中文乱码

    Delphi2010解决ZEOSDBO-7.1.3a控件调用mysql中文乱码 ZConnection1.Database:=_Database1; ZConnection1.Port:=_Port; ZConnection1.User:=_User; ZConnection1.Password:=_Password; ZConnection1.HostName:=_...

    彻底解决C# asp.net连接MySQL乱码问题

    ### 彻底解决C# ASP.NET 连接MySQL乱码问题 在开发过程中,尤其是在处理中文数据时,经常遇到的一个问题是数据库连接时出现乱码。本文将详细介绍如何彻底解决使用C# ASP.NET 应用程序连接 MySQL 数据库时出现的乱码...

    jsp+mysql中文乱码解决方案集合

    ### jsp+mysql中文乱码解决方案集合 在使用JSP结合MySQL进行Web应用开发时,中文乱码问题一直是困扰开发者的一大难题。本文将详细介绍如何在MySQL数据库层面解决中文乱码问题,并提供一系列实用的方法和技巧。 ###...

    PHP+MySql中文乱码解决办法

    ### PHP+MySQL中文乱码解决办法详解 #### 一、乱码产生的原因 在使用PHP+MySQL进行开发的过程中,中文乱码问题是常见的一个问题。乱码现象通常发生在从数据库查询中文数据时,显示出来的中文变成了不可识别的符号...

    MySQL中文乱码问题解决方案

    ### MySQL中文乱码问题解决方案 在使用MySQL的过程中,中文乱码问题是常见的问题之一,尤其是在数据库初始设置不当时,更容易出现此类问题。本文将详细介绍如何彻底解决MySQL中的中文乱码问题。 #### 一、理解中文...

    在DELPHI中使用MyDAC连接MySQL数据库时中文显示乱码的解决方法

    ### 在DELPHI中使用MyDAC连接MySQL数据库时中文显示乱码的解决方法 #### 背景介绍 在软件开发过程中,特别是涉及到多语言环境的应用程序开发时,字符编码问题常常成为开发者需要解决的一个重要问题。对于使用...

    C++操作MariaDB和MySql中文乱码或无法处理中文的解决办法

    C++操作MariaDB和MySql中文乱码或无法处理中文的解决办法 在使用C++操作MariaDB和MySQL数据库时,中文乱码或无法处理中文是一个常见的问题。本文将介绍如何解决这个问题,确保C++程序正确地处理中文。 解决方法 ...

    jsq+mybatis+mysql中文乱码解决方案

    JSQ+MyBatis+MySQL 中文乱码解决方案 中文乱码是 JSQ、MyBatis 和 MySQL 集成时常见的问题,解决这个问题需要从多方面入手。本文将从 JSP、MyBatis 和 MySQL 三个方面来解决中文乱码问题。 JSP 中文乱码解决方案 ...

    Mysql 中文乱码 最简单的解决办法

    总结,解决MySQL中文乱码问题的关键在于确保服务器、数据库、表及字段的字符集设置一致,并与数据源保持匹配。在开发和维护过程中,关注字符集的统一性,可以避免很多不必要的编码问题。通过上述步骤,你应该能够...

    Mysql中文乱码问题解决方案

    本文将深入探讨MySQL中文乱码问题的原因、解决方法,以及如何在创建数据库和表时避免这类问题。 首先,我们要了解字符集的概念。字符集(Character Set)是计算机系统用来表示文本的一系列符号和编码,例如ASCII、...

Global site tag (gtag.js) - Google Analytics