MySQL乱码问题

shuishou 贡献于2011-07-04

作者 雨林木风  创建于2011-06-24 08:18:00   修改者雨林木风  修改于2011-06-24 08:19:00字数7684

文档摘要:
关键词:

我自己都不知道为了中文问题烦恼了多少个日子,最恨瑞典人了-谁叫他发明了mysql,还设置了默认设置:latin1.曾经也在想假如中国人发明了 mysql(my see狗),呵呵,那么我们还有这样烦恼吗?默认的就是gk2312 或者gbk.倘若考虑到台湾朋友加一个big5.就得了。可是呢?事实不是这样的,没有办法,自己只好baidu一下,google一下,甚至yahoo 一下。能找到的方法都试过了,好久了,直到今天让我找到了,想明白了。所以急切和大家分享以下心得。   为了说的明白一些,我觉个例子: 很简单,就是从html中接受两个输入,然后由jsp处理写到mysql且从数据库返回这个结果显示出来。 Mysql_jstl.html   CH14 - Mysql_jstl.html  

将信息存入 Mysql 中 - 使用 JSTL 写法

  

姓:

  

名:

  

              

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" %>   CH14 - Mysql_jstl.jsp

将信息存入 Mysql 中 - 使用 JSTL 写法

  INSERT INTO employee(employee_id, last_name, first_name, birth, sex,emmail)    VALUES ( ? , ? , ? , ? , ? , ? )                         SELECT * FROM employee 从 employee 取出所有新增的姓名:
新增姓名:      
接下来就是创建数据库,名字为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 | +----------------------+-----------------+

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档