character-set-server/default-character-set:服务器字符集,默认情况下所采用的。

character-set-database:数据库字符集。

character-set-table:数据库表字符集。

优先级依次增加。所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集。

character-set-client:客户端的字符集。客户端默认字符集。当客户端向服务器发送请求时,请求以该字符集进行编码。

character-set-results:结果字符集。服务器向客户端返回结果或者信息时,结果以该字符集进行编码。

在客户端,如果没有定义character-set-results,则采用character-set-client字符集作为默认的字符集。所以只需要设置character-set-client字符集。

要处理中文,则可以将character-set-server和character-set-client均设置为GB2312,如果要同时处理多国语言,则设置为UTF8。

关于MySQL的中文问题

解决乱码的方法是,在执行SQL语句之前,将MySQL以下三个系统参数设置为与服务器字符集character-set-server相同的字符集。

character_set_client:客户端的字符集。

character_set_results:结果字符集。

character_set_connection:连接字符集。

设置这三个系统参数通过向MySQL发送语句:set names gb2312

关于GBK、GB2312、UTF8

UTF- 8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。

GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:

GBK、GB2312--Unicode--UTF8

UTF8--Unicode--GBK、GB2312

对于一个网站、论坛来说,如果英文字符较多,则建议使用UTF-8节省空间。不过现在很多论坛的插件一般只支持GBK。

GB2312是GBK的子集,GBK是GB18030的子集

GBK是包括中日韩字符的大字符集合

如果是中文的网站 推荐GB2312 GBK有时还是有点问题

为了避免所有乱码问题,应该采用UTF-8,将来要支持国际化也非常方便

UTF-8可以看作是大字符集,它包含了大部分文字的编码。

使用UTF-8的一个好处是其他地区的用户(如香港台湾)无需安装简体中文支持就能正常观看你的文字而不会出现乱码。

gb2312是简体中文的码

gbk支持简体中文及繁体中文

big5支持繁体中文

utf-8支持几乎所有字符

首先分析乱码的情况1.写入数据库时作为乱码写入

2.查询结果以乱码返回

究竟在发生乱码时是哪一种情况呢?

我们先在mysql 命令行下输入

show variables like '%char%';

查看mysql 字符集设置情况:

mysql> show variables like '%char%';

+--------------------------+----------------------------------------+

| Variable_name            | Value                                  |

+--------------------------+----------------------------------------+

| character_set_client     | gbk                                    |

| character_set_connection | gbk                                    |

| character_set_database   | gbk                                    |

| character_set_filesystem | binary                                 |

| character_set_results    | gbk                                    |

| character_set_server     | gbk                                    |

| character_set_system     | utf8                                   |

| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |

+--------------------------+----------------------------------------+

在查询结果中可以看到mysql 数据库系统中客户端、数据库连接、数据库、文件系统、查询

结果、服务器、系统的字符集设置

在这里,文件系统字符集是固定的,系统、服务器的字符集在安装时确定,与乱码问题无关

乱码的问题与客户端、数据库连接、数据库、查询结果的字符集设置有关

*注:客户端是看访问mysql 数据库的方式,通过命令行访问,命令行窗口就是客户端,通

过JDBC 等连接访问,程序就是客户端

我们在向mysql 写入中文数据时,在客户端、数据库连接、写入数据库时分别要进行编码转

在执行查询时,在返回结果、数据库连接、客户端分别进行编码转换

现在我们应该清楚,乱码发生在数据库、客户端、查询结果以及数据库连接这其中一个或多

个环节

接下来我们来解决这个问题

在登录数据库时,我们用mysql --default-character-set=字符集-u root -p 进行连接,这时我们

再用show variables like '%char%';命令查看字符集设置情况,可以发现客户端、数据库连接、

查询结果的字符集已经设置成登录时选择的字符集了

如果是已经登录了,可以使用set names 字符集;命令来实现上述效果,等同于下面的命令:

set character_set_client = 字符集

set character_set_connection = 字符集

set character_set_results = 字符集

如果是通过JDBC 连接数据库,可以这样写URL:

URL=jdbc:mysql://localhost:3306/abs?useUnicode=true&characterEncoding=字符集

JSP 页面等终端也要设置相应的字符集

数据库的字符集可以修改mysql 的启动配置来指定字符集,也可以在create database 时加上

default character set 字符集来强制设置database 的字符集

通过这样的设置,整个数据写入读出流程中都统一了字符集,就不会出现乱码了

为什么从命令行直接写入中文不设置也不会出现乱码?

可以明确的是从命令行下,客户端、数据库连接、查询结果的字符集设置没有变化

输入的中文经过一系列转码又转回初始的字符集,我们查看到的当然不是乱码

但这并不代表中文在数据库里被正确作为中文字符存储

举例来说,现在有一个utf8 编码数据库,客户端连接使用GBK 编码,connection 使用默认

的ISO8859-1(也就是mysql 中的latin1),我们在客户端发送“中文”这个字符串,客户端

将发送一串GBK 格式的二进制码给connection 层,connection 层以ISO8859-1 格式将这段

二进制码发送给数据库,数据库将这段编码以utf8 格式存储下来,我们将这个字段以utf8

格式读取出来,肯定是得到乱码,也就是说中文数据在写入数据库时是以乱码形式存储的,

在同一个客户端进行查询操作时,做了一套和写入时相反的操作,错误的utf8 格式二进制

码又被转换成正确的GBK 码并正确显示出来。

/****************java、jsp中设置编码***************************/

首先说在java里那些地方能够设置编码

下面两种设置编码格式方法适用于jsp页面(*.jsp)

下面方式适合于jsp、servlet、action中(*.java)

request.setCharacterEncoding("UTF-8");

response.setCharacterEncoding("UTF-8");

下面适合html页面(*.htm;*.html)

Tomcate设置编码(server.xml)

mysql设置编码命令

SET character_set_client = utf8;

SET character_set_connection = utf8;

SET character_set_database = utf8;

SET character_set_results = utf8;/*这里要注意很有用*/

SET character_set_server = utf8;

SET collation_connection = utf8_bin;

SET collation_database = utf8_bin;

SET collation_server = utf8_bin;

my.ini中配置默认编码

default-character-set=utf8

连接数据库设置编码

jdbc:mysql://192.168.0.5:3306/test?characterEncoding=utf8

/*****************************************java与mysq编码对应****************************************/

java中的常用编码UTF-8;GBK;GB2312;ISO-8859-1;

对应mysql数据库中的编码utf8;gbk;gb2312;latin1

/********************************************过滤器使用*********************************************/

//过滤器设置编码过滤(SetCharacterEncodingFilter.java)

package com.sorc;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class SetCharacterEncodingFilter extends HttpServlet implements Filter{

private FilterConfig filterConfig;

private String encoding=null;

//Handle the passed-in FilterConfig

public void init(FilterConfig filterConfig){

this.filterConfig=filterConfig;

encoding=filterConfig.getInitParameter("encoding");

}

//Process the request/response pair

public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain){

try{

request.setCharacterEncoding(encoding);

filterChain.doFilter(request,response);

} catch(ServletException sx){

filterConfig.getServletContext().log(sx.getMessage());

} catch(IOException iox){

filterConfig.getServletContext().log(iox.getMessage());

}

}

//Clean up resources

public void destroy(){

}

}

//web.xml配置过滤器方法(web.xmd)

setcharacterencodingfilter

com.sorc.SetCharacterEncodingFilter

encoding

utf8

setcharacterencodingfilter

/*

/***************有了上面的基础下面试完满解决方案*****************************************/

1.使用GBK编码的解决方案

这个最简单 遇到设置编码的地方就是用GBK数据库gbk 然后在使用个过滤器过滤编码为gbk一切搞定。

效果为添加数据无乱码 读出无乱码 数据库管理工具无乱码 到处sql结构和数据无乱码

2.使用UTF-8编码解决方案

所有编码都设置为UTF-8

数据库编码utf8

设置过滤器编码utf8

数据库连接?characterEncoding=utf8

然后在数据库管理工具或mysql命令行 运行 SET character_set_results = gbk;

效果为添加数据无乱码 读出无乱码 数据库管理工具无乱码 到处sql结构和数据时存在乱码

3.页面使用UTF8 数据库使用latin1的解决方案

jap java tomcat 设置为UTF-8

过滤器 utf8

数据库连接?characterEncoding=latin1

数据库其他latin1

然后在数据库管理工具或mysql命令行 运行 SET character_set_results = gbk;

效果为添加数据无乱码 读出无乱码 数据库管理工具无乱码 到处sql结构和数据时存在乱码

以上都不需要页面或java代码中手动转码

mysql字符集乱码问题_解决mysql字符集乱码问题相关推荐

  1. mysql数据库导入外部数据乱码么_解决MySQL数据库导入导出数据乱码的问题

    最近在linux上面用mysqldump导出数据,放在windows系统中导入就会出现中文乱码,然后就会导致出现: Unknown MySQL server host和Can't connect to ...

  2. mysql占用多少内存_解决mySQL占用内存超大问题

    解决mySQL占用内存超大问题 解决mySQL占用内存超大问题 为了装mysql环境测试,装上后发现启动后mysql占用了很大的虚拟内存,达8百多兆.网上搜索了一下,得到高人指点my.ini.再也没见 ...

  3. python乱码怎么办_解决python发送邮件乱码问题

    使用python发邮件很简单,但是遇到乱码问题很烦恼. 乱码问题有几种:有发件人名称乱码,有标题乱码,也有正文乱码的问题. 一.发件人名称乱码 要解决发件人名称乱码问题,必须使用Header,如下代码 ...

  4. mysql数据库断开连接_解决mysql服务器在无操作超时主动断开连接的情况

    我们在使用mysql服务的时候,正常情况下,mysql的设置的timeout是8个小时(28800秒),也就是说,如果一个连接8个小时都没有操作,那么mysql会主动的断开连接,当这个连接再次尝试查询 ...

  5. mysql拒绝远程连接_解决Mysql数据库拒绝远程连接和忘记密码的问题

    解决数据库忘记密码的问题 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 编辑m ...

  6. mysql中文模糊查询_解决MySQL中文模糊查询问题

    解决MySQL中文模糊查询问题: 我们在MySQL中进行中文模糊查询时,经常会返回一些与之不相关的记录,比如查找%a%时,返回的可能有中文字符,却没有a字符存在.对于此问题目前发现一种方法可以很方便解 ...

  7. mysql远程不能访问_解决MySQL无法远程访问的3方案

    在解决MySQL无法远程访问的实际操作中我们经常会选择的方案,除了改表法与授权法,在安装MySQL的机器上运行这一方法也是比较好用的方案,以下就是文章对解决MySQL无法远程访问的一些解决方案的描述. ...

  8. mysql5.5字符集不匹配_解决mysql 查询字符集不匹配的问题

    mysql数据库建表的时候采用的是latin的字符集,而网页中查询的是utf-8,当输入页面输入中文,然后再数据库中查询的时候,就会报出 ER_CANT_AGGREGATE_2COLLATIONS: ...

  9. mysql 中文模糊查询_解决mysql中文模糊查询问题的方法

    mysql进行中文模糊检索时,经常会返回一些与之不相关的记录,如查找 "%a%" 时,返回的可能有中文字符,却没有a字符存在. 通过阅读MySQL的Manual,发现了一种可以满意 ...

最新文章

  1. 重构ncnn,腾讯优图开源新一代移动端推理框架TNN
  2. POJ1144——网络(求割点)
  3. 服务端高并发分布式架构演进之路【转】
  4. docker 如何删除<none>镜像
  5. 476. 数字的补数 【位运算】
  6. 高级JAVA码农必须搞清楚它们的区别:instanceof、isInstance、isAssignableFrom
  7. 代码注释掉还能执行_日志消息是可执行代码和注释
  8. PythonDay7
  9. vb access mysql数据库教程_vb操作access数据库的方法
  10. 项目经理和产品经理之区别
  11. 蚂蚁金服前端实习生二面面经
  12. zabbix报警邮件qq邮箱收不到的问题
  13. 【Oracle 11g学习路线】
  14. 2021年岳阳市高考成绩查询,2021年岳阳高考状元名单公布,岳阳文理科状元是谁多少分...
  15. kronecker积与hadamard积
  16. 投影仪用光学引擎行业现状调研及趋势分析报告
  17. Java体系总结 cf2e3d1401904217a28c0bd2d09c5e72
  18. 影响消费者行为的个人因素
  19. Cmake在VS下设置MT
  20. 冯诺依曼体系结构与操作系统的理解

热门文章

  1. 如何替换掉apk中的配置
  2. bibi黑马MySQL学习笔记之约束
  3. linux系统管理员试题,Linux系统管理员测试题及答案
  4. 解决win7自带天气小工具不能使用
  5. 采购堡垒机时候,选择开源堡垒机还是云堡垒机?
  6. TCL:不断扩张的业务,不断下跌的股价
  7. ubuntu linux下批量重命名工具:purrr
  8. 区块链Opyn ETH Put逻辑漏洞技术分析
  9. Dockerfile 构建 8-jre-alpine
  10. 2014春运直通车:12306网上订火车票全攻略