MYSQL 字符集问题【转】

MySQL的字符集支持(Character Set Support)有两个方面:
       1:字符集(Character set)

2:排序方式(Collation)

对于字符集的支持细化到四个层次:
       1:服务器(server):

2:数据库(database)

3:数据表(table)

4:连接(connection)

MySQL默认字符集
       MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。但是,传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置。那么,默认的配置从何而来呢?

(1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
     (2)安装MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
     (3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
     (4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
     (5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
     (6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
     (7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;

简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 UTF-8 存储。

查看默认字符集

默认情况下,mysql的字符集是latin1(ISO_8859_1。
     通常,查看系统的字符集和排序方式的设定可以通过下面的两条命令:
     mysql> SHOW VARIABLES LIKE ‘character%‘;
+--------------------------+---------------------------------+
| Variable_name                | Value                                     |
+--------------------------+---------------------------------+
| character_set_client        | latin1                                     |
| character_set_connection | latin1                                     |
| character_set_database    | latin1                                     |
| character_set_filesystem   | binary                                     |
| character_set_results        | latin1                                     |
| character_set_server         | latin1                                     |
| character_set_system        | utf8                                       |
| character_sets_dir             | D:"mysql-5.0.37"share"charsets" |
+--------------------------+---------------------------------+
mysql> SHOW VARIABLES LIKE ‘collation_%‘;
+----------------------+-----------------+
| Variable_name         | Value            |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database    | utf8_general_ci |
| collation_server      | utf8_general_ci |
+----------------------+-----------------+

修改默认字符集
    (1) 最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值,
    如 default-character-set = utf8
       character_set_server = utf8
    修改完后,重启mysql的服务,service mysql restart
    使用 mysql> SHOW VARIABLES LIKE ‘character%‘;查看,发现数据库编码均已改成utf8
+--------------------------+---------------------------------+
| Variable_name             | Value                            |
+--------------------------+---------------------------------+
| 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-5.0.37"share"charsets" |
+--------------------------+---------------------------------+
    (2) 使用mysql的命令
    mysql> SET character_set_client = utf8 ;

(3)修改数据库的字符集
    mysql>use mydb
    mysql>alter database mydb character set utf-8;

    (4)创建数据库指定数据库的字符集
    mysql>create database mydb character set utf-8;
    (5)通过配置文件修改:
   修改/var/lib/mysql/mydb/db.opt
   default-character-set=latin1
   default-collation=latin1_swedish_ci
   为
   default-character-set=utf8
   default-collation=utf8_general_ci
   重起MySQL:

MySQL中涉及的几个字符集

1>character-set-server/default-character-set:服务器字符集,默认情况下所采用的。
    2>character-set-database:数据库字符集。
    3>character-set-table:数据库表字符集。
    优先级依次增加。所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集。
    4>character-set-client:客户端的字符集。客户端默认字符集。当客户端向服务器发送请求时,请求以该字符集进行编码。
    5>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占用的数据库比GBK大。

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 = 字符集

如果碰到上述命令无效时,也可采用一种最简单最彻底的方法:

一、Windows

1、中止MySQL服务
2、在MySQL的安装目录下找到my.ini,如果没有就把my-medium.ini复制为一个my.ini即可
3、打开my.ini以后,在[client]和[mysqld]下面均加上default-character-set=utf8,保存并关闭
4、启动MySQL服务

要彻底解决编码问题,必须使

| character_set_client     | gbk                                    | 
| character_set_connection | gbk                                    | 
| character_set_database   | gbk                                    | 
| character_set_results    | gbk                                    | 
| character_set_server     | gbk                                    | 
| character_set_system     | utf8

这些编码相一致,都统一。

如果是通过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 码并正确显示出来。

时间: 2024-10-19 10:38:17

MYSQL 字符集问题【转】的相关文章

MySQL字符集

一. 选择合适的字符集 二. MySQL支持的字符集 MySQL服务器可以支持多种字符集,在同一台服务器.同一个数据库甚至同一个表的不同字段都可以指定使用不同的字符集. 查看所有可用的字符集命令是show character set; 或者查看information_schema.character_set,可以显示所有的字符集和该字符集默认的校对规则.desc information_schema.character_sets; MySQL的字符集包括字符集(CHARACTER)和校对规则(C

MySQL 字符集

查看mysql 字符集设置情况: show variables like '%char%' +--------------------------+----------------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------------+ | character_set_client | gbk | | chara

mysql字符集小结

author:skate time:2013/04/09 mysql字符集小结 今天同事阿杰兄发现内部一台mysql测试服务器乱码,以前也记录过关于字符集的,今天再补充下 修改mysql的字符集和默认存储引擎 http://blog.csdn.net/wyzxg/article/details/7581415 查看库现有的字符集: mysql> show variables like '%char%'; +--------------------------+------------------

关于MySQL字符集问题【已解决】

关于MySQL字符集问题[已解决] 先来看看我的字符集设置 全都是utf8.这里没有什么问题 接下来我创建了一个数据表book.来看下我创建的表结构 当输入命令:mysql> insert into book(bookname,publisher,author,price,detail) values('PHP','电子工业出版社','武胜利','80.00','与PHP相关的图书');ERROR 1366 (HY000): Incorrect string value: '\xB5\xE7\x

mysql字符集调整总结

mysql字符集调整总结 --http://xjsunjie.blog.51cto.com/999372/1355013 字符集是一套符号和编码的规则,不论是在oracle数据库还是在mysql数据库,都存在字符集的选择问题.对于数据库来说,字符集又是比较重要的,因为数据库存储的数据大部分都是各种文字,字符集对于数据库的存储.处理性能以及数据迁移都有重要的影响. 如果在数据库创建阶段没有正确选择字符集,那么可能在后期需要更换字符集,而字符集的更换是代价比较高的操作,也存在一定的风险,所以我们建议

MySQL字符集编码

MySQL字符集编码总结 之前内部博客上凯哥分享了一篇关于mysql字符集的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并参考了凯哥的文章,总结了这篇博文.本文主要是对mysql常见的字符集问题进行整理,如有错误,请大家指正. 1.MySQL字符集编码简介 谈到字符集,总会跟编码扯上关系,有关字符集和编码的理论知识请参见我之前的文章.MySQL内部是支持多种字符集的,这里就不再严格区分字符集和编码的概念了.同时,MySQL中

docker mysql 文件挂载和MySQL字符集设置

docker run -p 3306:3306 --name mysql -v /usr/local/mysql/my.cnf:/etc/mysql/my.cnf -v /usr/local/mysql/logs:/logs -v /usr/local/mysql/data:/mysql_data -e MYSQL_ROOT_PASSWORD=root -d mysql:5.6 -p 3306:3306:将容器的3306端口映射到主机的3306端口 -v $PWD/conf/my.cnf:/et

MySQL字符集的设置

Notice:文章基于ubuntu系统而写 1.关于MySQL字符集 MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation). MySQL对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection). MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集. 2.查看MySQL字符集 2.1.查看字符集

phpmyadmin里MySQL字符集:cp1252 West European (latin1) ,解决乱码问题

使用虚拟主机空间上的phpmyadmin操作数据库的时候,如果看到phpmyadmin首页上显示的MySQL 字符集为cp1252 West European (latin1),当我们导入数据时就会出现乱码,解决的方法是: 在phpmyadmin首页的右边有个Language选项,把默认的中文 - Chinese simplified-gb2312改成 中文 - Chinese simplified,则左边的MySQL 字符集会变成UTF-8 Unicode (utf8) ,乱码问题得到解决!

第09章 mysql 字符集

2015-10-24 目录 参考资料 [1] 唐汉明.深入浅出MySQL 数据库开发.优化与管理维护(第2版)[M].北京:人民邮电出版社,2014 [2] Schwartz.高性能MySQL(第3版)[M].北京:电子工业出版社,2013 [3] 范德兰斯.MySQL开发者SQL权威指南 [M].北京:机械工业出版社,2008 [4] Forta.MySQL必知必会 [M].北京:人民邮电出版社,2009 [5] Mysql字符集设置 [6] 修改及查看mysql数据库的字符集 [7] MyS