`
mmtye
  • 浏览: 7672 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

彻底解决MySql在UTF8字符集下乱码问题

阅读更多
为了顺利的开发一个多语言的国际化J2EE程序,需要修改数据库字符集,我的做法如下:

安装 MySq时选择字符集为UTF-8

修改MySql安装目录下的my.ini中配置的默认编码:
该文件中有两处这样的配置:default-character-set=latin1
将这两处改成:default-character-set=utf8

新建数据库需指定字符集:
UTF8: CREATE DATABASE mmtye DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

在命令行查看字符集编码:show variables like '%char%'; 会看到如下信息:
character_set_client     | utf8
character_set_connection | utf8
character_set_database   | utf8
character_set_filesystem | binary
character_set_results    | utf8
character_set_server     | utf8
character_set_system     | utf8
character_sets_dir       | D:\MySQL\share\charsets\

以上内容在重启MySql后也一直有效,无需每次启动数据库都要指定。

A、为了在命令行下能正确查看中文,命令行下执行:
set character_set_results=gbk;

B、若需要在windows命令行执行insert、update,则执行:
set character_set_client=gbk;
A、B 两个命令重启数据库前有效,重启后就失效了。
分享到:
评论
19 楼 舞指如歌 2010-12-04  
如果在my.ini中设置了[mysqld]下的default-character-set=utf8 ,那么在建表的时候就不用再次指定字符集了,因为[mysql]下配置的字符集指得就是建表和建库时的缺省字符集。
18 楼 sdh5724 2010-12-03  
rain2005 写道
不清楚tomcat 的URIEncoding默认为什么是ISO-8859-1


老人不知编码之痛苦~
17 楼 rain2005 2010-12-01  
不清楚tomcat 的URIEncoding默认为什么是ISO-8859-1
16 楼 sdh5724 2010-11-30  
ch_space 写道
TO:sdh5724

非常感谢您的指点!以前一些错误的理解终于搞清了,只是还有一点不太明白:

对浏览器发送的请求http://abc.com/?s=中文,是以什么编码发送的,gbk?utf-8?还是其他的?
对于请求
http://abc.com/?s=%E4%B8%AD
http://abc.com/?s=english
又分别是以什么编码发送的呢?

再次表示感谢!



我只说通常情况:
根据URI规范, URL的?前面的部分是使用UTF8编码的。 这是规范要求, 但是在国内的一些应用上有违反的情况。
但是?后面的部分是根据当前的网页的编码/或者你浏览器的语言/OS语言来识别的。 也就是说, 这个编码不是固定的。 通常, 在我们中文的WINDOWS/IE 上, 肯定发送的是GBK编码的内容。
为了让WEB SERVER能识别这样的情况, WEB SERVER容器可以设置URL参数的编码。
15 楼 gepp2010 2010-11-30  
搞个linux就不行了
14 楼 colver 2010-11-26  
xuexi....
13 楼 ch_space 2010-11-25  
TO:sdh5724

非常感谢您的指点!以前一些错误的理解终于搞清了,只是还有一点不太明白:

对浏览器发送的请求http://abc.com/?s=中文,是以什么编码发送的,gbk?utf-8?还是其他的?
对于请求
http://abc.com/?s=%E4%B8%AD
http://abc.com/?s=english
又分别是以什么编码发送的呢?

再次表示感谢!
12 楼 sdh5724 2010-11-25  
回楼上:
byte[] bytes="中".getBytes("utf-8");    //这句代码告诉我, 你的文件是UTF8写的。 编译的时候必须指定JAVA文件的编码
System.out.println(new String(wd.getBytes("gbk"),"utf-8"));//你告诉我, 你的控制台是UTF8编码的。

为什么, 第二个能不乱码呢, 这是因为iso-8859-1的转化是做的一对一的字节映射,他永远是不会错的。 这样的做法实际是错误的, 能正确显示的唯一原因是因为这个iso8859-1的编码转化的时候是什么事情也没有做。

第一个会错是因为, 你用了一个GBK的字节码变换成UTF8编码, 很明显这样做是不对的。怎么可能用GBK直接转成UTF8呢。。。。

JAVA中间过程你理解下:
读文件是用GBK===》内存的里string已经是UNICODE了, 跟GBK没有关系了。
然后, 你想用UTF8输出到流文件里去。 自然是   byte[] bytes=string.getBytes("utf-8");  然后把bytes数据写到文件/流/控制台上。











11 楼 ch_space 2010-11-25  
sdh5724 写道
所谓的彻底解决难道一竿子全部设置成UTF8啊。 看来charset要彻底的理解还是困难。

如果彻底的理解字符集合, 完全可以做到 数据库/JSP/HTML/driver全部都是不一致的编码。 能做到这些完全是因为JAVA内部的处理是UNICODE。 也就是每个经过JAVA处理的东西, 只要告诉JAVA处理目标的编码即可。 另外, 也就是, 要在客户端能正确看到, 也要告诉JAVA输出的目标的编码是什么。

我举个例子
1. 读取GBK的数据库的数据
2. 读取gb2312的文件
3. 读取UTF8编码的模板文件
在经过JAVA处理后, 我们可以统一输出到一个gb1830的HTML文档里去。
当然, 这样的处理99%的字符肯定是对的。 我也遇到个别字符的特殊情况。 主要是UTF8/GBK之间存在一些字符映射不存在。 



 @Test
	public void test() throws Exception{
		byte[] bytes="中".getBytes("utf-8");
		String wd=new String(bytes,"gbk");
		System.out.println(new String(wd.getBytes("gbk"),"utf-8"));//为什么乱码?
	}


改成如下则输出则无乱码,为什么?
 @Test
	public void test() throws Exception{
		byte[] bytes="中".getBytes("utf-8");
		String wd=new String(bytes,"iso-8859-1");
		System.out.println(new String(wd.getBytes("iso-8859-1"),"utf-8"));
	}

10 楼 wanghao_bugs 2010-11-25  
1.将所有遇到字符集的地方全部设置成utf8,这样能避免出现乱码。
2.确保存入数据库和读取数据库的字符集是一样的,也可以解决这个问题。例如,数据库的表的字符时utf8,jsp页面 上设置contentType=gbk,这样虽然编码不同,但是不会出现乱码。
3.最重要的是要设置数据库的default-character-set=utf8。
9 楼 liberD 2010-11-24  
不错。我正发愁命令行行的乱码问题!希望成功!
8 楼 sdh5724 2010-11-21  
所谓的彻底解决难道一竿子全部设置成UTF8啊。 看来charset要彻底的理解还是困难。

如果彻底的理解字符集合, 完全可以做到 数据库/JSP/HTML/driver全部都是不一致的编码。 能做到这些完全是因为JAVA内部的处理是UNICODE。 也就是每个经过JAVA处理的东西, 只要告诉JAVA处理目标的编码即可。 另外, 也就是, 要在客户端能正确看到, 也要告诉JAVA输出的目标的编码是什么。

我举个例子
1. 读取GBK的数据库的数据
2. 读取gb2312的文件
3. 读取UTF8编码的模板文件
在经过JAVA处理后, 我们可以统一输出到一个gb1830的HTML文档里去。
当然, 这样的处理99%的字符肯定是对的。 我也遇到个别字符的特殊情况。 主要是UTF8/GBK之间存在一些字符映射不存在。 



7 楼 moonjava 2010-11-21  
xiaoxin5230 写道
这个只是解决了mysql的编码,但是没有解决j2ee的编码问题。
解决j2ee编码问题步骤:
1.设置mysql的字符编码为utf-8,可以在安装的时候设置,也可以用楼主的方法设置
2.设置容器的编码:比如tomcat,打开server.xml,找到8080 加速URIEncoding="utf-8"
3.设置url的字符编码。应为url传递参数默认都是iso8859-1,所以需要将头信息改成utf-8,可以自己写个过滤器修改头信息,也可以用spring现有的过滤器。
以上3点完成,这才叫彻底解决编码问题了


jsp页面的头要不要设置呢?
数据库的驱动呢?
6 楼 jieyuan_cg 2010-11-19  
设置成UTF-8是好,可是,对某个字段按照中文来排序,你就没办法了……
5 楼 因为java所以java 2010-11-19  
白糖_ 写道
如果SSH2框架的话,还需要在Action中加上序列化serialVersionUID,在数据库连接的地方我常常也会加一个characterEncoding=utf-8

请教:在action中加入serialVersionUID跟编码有关系吗?谢谢
4 楼 白糖_ 2010-11-19  
如果SSH2框架的话,还需要在Action中加上序列化serialVersionUID,在数据库连接的地方我常常也会加一个characterEncoding=utf-8
3 楼 xiaoxin5230 2010-11-19  
这个只是解决了mysql的编码,但是没有解决j2ee的编码问题。
解决j2ee编码问题步骤:
1.设置mysql的字符编码为utf-8,可以在安装的时候设置,也可以用楼主的方法设置
2.设置容器的编码:比如tomcat,打开server.xml,找到8080 加速URIEncoding="utf-8"
3.设置url的字符编码。应为url传递参数默认都是iso8859-1,所以需要将头信息改成utf-8,可以自己写个过滤器修改头信息,也可以用spring现有的过滤器。
以上3点完成,这才叫彻底解决编码问题了
2 楼 mmtye 2010-11-15  
补充一下,新建表的时候要加上字符集,例如:
create table dloginmsg(
......
.....
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
1 楼 mmtye 2010-11-15  
windows7下这个做法是正常的,xp下没有进行测试。

相关推荐

    MYSQL字符集乱码的解决

    ### MySQL字符集乱码问题及解决方案 #### 一、问题背景 在使用MySQL数据库时,很多用户会遇到中文字符显示为乱码的情况。这通常是因为MySQL数据库中的字符集设置不一致导致的。例如,在命令行下操作MySQL时,可能会...

    mysql 字符集 乱码问题

    3. **修改my.cnf配置文件**:编辑MySQL服务端的配置文件`my.cnf`,在`[mysqld]`或`[mysql]`节下添加`init-connect='SET NAMES utf8'`,这样每次启动MySQL服务时都会自动设置字符集为UTF-8。 - 示例配置: ``` ...

    设定mysql字符集解决终端乱码

    本文将详细介绍如何通过设定 MySQL 的字符集来解决终端乱码的问题。 #### 一、理解 MySQL 字符集相关变量 在 MySQL 中,有多个与字符集相关的系统变量,这些变量决定了数据在客户端和服务端之间的传输以及存储方式...

    mysql示例数据库(world)_解决中文乱码_使用UTF8字符集

    总结来说,解决MySQL中文乱码问题的关键在于正确设置服务器、数据库、表、列以及客户端的字符集为UTF8。通过以上步骤,你可以在world示例数据库中存储和操作中文数据,而不会遇到乱码问题。记住,字符集的统一和兼容...

    MYSQL字符集与乱码问题分析

    《MySQL字符集与乱码问题分析》一文深入探讨了字符编码的历史背景、技术细节以及在MySQL中的应用,尤其关注解决常见的乱码问题。本文将根据提供的内容摘要,详细阐述其中涉及的关键知识点。 ### 字符集背景知识 ##...

    mysql乱码的解决方法

    在某些情况下,我们可以通过临时设置字符集来解决问题,但这只是治标不治本的方法: ```sql SET character_set_client = utf8; SET character_set_connection = utf8; SET character_set_database = utf8; SET ...

    Unity3D教程:修改mysql字符编码成为UTF82

    首先,我们遇到的问题是即使设置表的默认字符集为UTF8,并且在发送查询时使用UTF-8编码,仍然会出现乱码的情况。这是因为在数据库连接层面上,字符集设置可能没有正确地同步。为了解决这个问题,我们需要在发送查询...

    精通MySQL字符集与校对集

    例如,`utf8_general_ci`和`utf8_bin`都是`utf8`字符集下的校对集,其中`utf8_general_ci`区分大小写但不区分重音,而`utf8_bin`则区分大小写和重音。 - **校对集示例**:在创建表或列时,可以通过`COLLATE`关键字...

    解决 docker mysql 中文乱码问题

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

    mysql乱码问题解决办法

    在解决MySQL乱码问题前,首先需要了解MySQL中与字符集相关的配置项及其含义: 1. **`character_set_system`**:系统默认使用的字符集。 2. **`character_set_server`**:服务器默认使用的字符集。 3. **`character_...

    设置mysql字符集

    本文将深入探讨如何设置MySQL的字符集,以及解决因字符集配置不当导致的乱码问题。 ### MySQL字符集的基本概念 字符集(Character Set)定义了数据在存储和处理时所采用的编码标准,而校对集(Collation)则规定了...

    flowable相关数据库表mysql, 包含两种字符集utf8 和 utf8bm4

    springboot在集成flowable时,添加flowable依赖,配置完成数据库连接,项目第一次启动会初始化数据库flowable相应的表,默认会加载的字符集为utf8(CHARSET=utf8 COLLATE utf8_bin),在mysql8后,在创建数据库时,...

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

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

    MySql修改数据库编码为UTF8避免造成乱码问题

    为了彻底解决这一问题,需要在MySQLInstanceConfig.exe中重新启动设置,将默认编码设置为utf8。 MySQLInstanceConfig.exe是MySQL安装目录下的一个配置工具,通过这个工具可以对数据库实例进行配置,包括默认字符集...

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

    2. **数据库表的字符集设置**:如果MySQL数据库中的表字符集不是统一的UTF-8,那么在查询时就可能出现乱码现象。 3. **连接参数配置不当**:在使用MyDAC组件建立数据库连接时,如果没有正确设置字符集参数,也可能...

    Linux mysql utf8

    在这个文件中,我们可以设置 MySQL 的默认字符集为 UTF8。 首先,我们需要找到 `[client]` 部分,并添加 `default-character-set=utf8` 行,以设置客户端的默认字符集为 UTF8。 其次,我们需要找到 `[mysqld]` ...

    Mysql字符集编码详解

    Mysql字符集编码详解 Mysql数据库中的字符集编码问题是许多开发者经常遇到的一个问题,特别是在JAVA项目中。解决这个问题需要从多方面入手,包括...通过设置合适的字符集,可以彻底解决JAVA项目中的中文乱码问题。

    mysql乱码解决问题

    ### MySQL乱码问题解决方案 ...通过以上步骤,可以有效地解决由字符集不匹配导致的MySQL乱码问题。此外,建议统一使用UTF-8作为字符集,这样可以更好地支持国际化需求,减少因字符集差异带来的问题。

Global site tag (gtag.js) - Google Analytics