UTF8默认编码下的MYSQL命令框中输入汉字显示乱码的问题 分类: 测试 2013-08-02 14:16 371人阅读 评论(0) 收藏
2013-08-02 14:16
357 查看
在UTF8默认编码下的MYSQL命令框中输入汉字显示乱码的问题:比如select
count(`姓名`) from tb
就出错,如果只是想临时修改编码以利于查询GB2312或GBK,可用以下2命令(关闭客户端后又恢复UTF8):
1、mysql> set character_set_client='gbk';或:set
character_set_client=gb2312;定义客户端编码
2、mysql> set character_set_results='gbk';或:set
character_set_results=gb2312;定义结果集编码。
如果想存储也用GBk,则加设character_set_database
collation是排序相关的字符集变量,用show variables like 'collation%';显示,collation_connection:意义可类推
以上set character_set_.....是一条条修改,也可用set names 'gbk'一下子全部修改字符集
set names 'gbk'等价于(不会对character_set_database影响):
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x
-----------------------------------------------------------------------------------------------------
MySQL数据库在字符集的处理上,可以说是相当灵活。以下是我在实际工作中关于字符集的设置与处理方面的一个总结。
一、显示字符集相关的变量值
mysql> show variables like 'chara%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | d:\mysql-5.0.9-beta-win32\share\charsets/ |
+--------------------------+-------------------------------------------+
7 rows in set (0.02 sec)
mysql> show variables like 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | gbk_chinese_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set
需要说明的是: collation是与排序相关的字符集变量, 上述变量值是mysql
二、字符集相关各变量的意义
character_set_client: 客户端字符集(应用程序客户端使用的字符集),实际上它与当前会话相关。
character_set_connection: 连接字符集,指的是mysql网络传输中使用的字符集,也与会话相关。
character_set_database: 指的数据库表中物理存储使用的字符集。
character_set_results: 指的是使用sql查询处理以后返回结果使用的字符集。
character_set_server:指的是mysql数据库服务器端使用的字符集。
character_set_system:指的是数据库中存储元信息使用的字符集。
collation_connection:意义可以类推
三、字符集的修改
我们可以对单个变量进行修改,如
set character_set_client=gbk
也可以使用set names 来同时修改几个变量, 如
set names 'gbk' 可一下子全部修改字符集
等价于:
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;
值得注意的是:collation_connection变量缺省下与character_set_connection是相关联的,即
collation_connection取决于character_set_connection的值。
如:
mysql> set names 'gbk';
Query OK, 0 rows affected (0.08 sec)
mysql> show variables like 'chara%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | latin1 |
| character_set_results | gbk |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | d:\mysql-5.0.9-beta-win32\share\charsets/ |
+--------------------------+-------------------------------------------+
7 rows in set (0.00 sec)
mysql> show variables like 'collation%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | gbk_chinese_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
我们可以看到 set names 'gbk'改变了character_set_client, character_set_connection, character_set_results, collation_connection的值.
如果要单独指定collation_name,可以使用
SET NAMES 'charset_name' COLLATE 'collation_name'
另一种修改多个变量的命令是:
SET CHARACTER SET x 等价于:
SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;
你可以自己体验一下该命令带来的字符集变量值的变动。
那么character_set_server, character_set_database的值怎么修改呢?直接在命令行里修改是不起作用的。
最好的方式是在配置文件my.ini中直接修改,在[mysqld]项下边添加:
default_character_set=GBK
当然,你如果想尝试,使用mysqld-nt --default_character_set=GBK来启动数据库也未尝不可,但我并不推荐这么做。
my.ini文件的搜索顺序是:
在版本4.1.5之前,必须在c:\my.cnf or c:\Windows\my.ini下边,这个有待检验。
在后续版本里,my.ini缺省就在mysql的安装目录下边。
强调一点:mysql --default-character-set=gbk -u root
或 mysql --defaults-file=c:\my.ini -u root
在my.ini中添加如下内容
[mysql] or [client]
default-character-set=gbk
或mysql -u root再执行set names 'gbk'
这三者效果完全一样。
四、乱码的产生
乱码的产生主要是由于字符集变量设置的不一致造成的。
操作系统有一个在显示字符时要使用的locale变量,linux下使用locale命令可以看到。
windows下使用chcp可以看到,gbk对应的code page应该是936。
如果操作系统安装了当前字符集与目标字符集的转换表,则能正确显示目标字符集中的字符,否则就会出现乱码。
latin1对应的是iso8859_1字符集,默认情况下,可以与gbk相互转换,至少在操作系统一级是这样。
五.乱码的避免
最好让上述9个字符集变量值保持一致,或者至少"兼容",同时也要考虑到OS中locale的值。
当然:character_set_system例外,它是存储和表示元信息使用的字符集,一般都是ascii串,使用utf8和使用latin1基本一样,但是,如果使用中文,可能就另当别论了。下边说的全部变量是指除了character_set_system以外的其它变量。
这里推荐三个方案:
1. 全部使用latin1
但是在java程序中,它担着一定的风险,即在入库之前,需要将字符串从gbk转换到iso8859_1,出库以后,获取结果时,再从iso8859_1转到gbk.
否则会出现乱码。
这种方式比较适合于C代码,显示依赖于操作系统的locale.一般都不用转换。
2. 全中文支持,全部设置成gbk.
方法:
在my.ini中修改添加:(这个是必须的)
[mysqld]
default-character-set=gbk
在java程序里边使用"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=GBK"这样的url,表明使用GBK进行编码。
3. utf8字符集支持.
方法:
在my.ini中修改添加:
[mysqld]
default-character-set=utf8
在java程序里边使用"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"这样的url,表明使用GBK进行编码。
注意utf8与UTF-8的分别.
utf8的好处是java虚拟机可以自动将它与gbk进行转换,因而显示都不会有乱码。可是在控制台下(cmd),显示就有问题了
count(`姓名`) from tb
就出错,如果只是想临时修改编码以利于查询GB2312或GBK,可用以下2命令(关闭客户端后又恢复UTF8):
1、mysql> set character_set_client='gbk';或:set
character_set_client=gb2312;定义客户端编码
2、mysql> set character_set_results='gbk';或:set
character_set_results=gb2312;定义结果集编码。
如果想存储也用GBk,则加设character_set_database
collation是排序相关的字符集变量,用show variables like 'collation%';显示,collation_connection:意义可类推
以上set character_set_.....是一条条修改,也可用set names 'gbk'一下子全部修改字符集
set names 'gbk'等价于(不会对character_set_database影响):
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x
-----------------------------------------------------------------------------------------------------
MySQL数据库在字符集的处理上,可以说是相当灵活。以下是我在实际工作中关于字符集的设置与处理方面的一个总结。
一、显示字符集相关的变量值
mysql> show variables like 'chara%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | d:\mysql-5.0.9-beta-win32\share\charsets/ |
+--------------------------+-------------------------------------------+
7 rows in set (0.02 sec)
mysql> show variables like 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | gbk_chinese_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set
需要说明的是: collation是与排序相关的字符集变量, 上述变量值是mysql
二、字符集相关各变量的意义
character_set_client: 客户端字符集(应用程序客户端使用的字符集),实际上它与当前会话相关。
character_set_connection: 连接字符集,指的是mysql网络传输中使用的字符集,也与会话相关。
character_set_database: 指的数据库表中物理存储使用的字符集。
character_set_results: 指的是使用sql查询处理以后返回结果使用的字符集。
character_set_server:指的是mysql数据库服务器端使用的字符集。
character_set_system:指的是数据库中存储元信息使用的字符集。
collation_connection:意义可以类推
三、字符集的修改
我们可以对单个变量进行修改,如
set character_set_client=gbk
也可以使用set names 来同时修改几个变量, 如
set names 'gbk' 可一下子全部修改字符集
等价于:
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;
值得注意的是:collation_connection变量缺省下与character_set_connection是相关联的,即
collation_connection取决于character_set_connection的值。
如:
mysql> set names 'gbk';
Query OK, 0 rows affected (0.08 sec)
mysql> show variables like 'chara%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | latin1 |
| character_set_results | gbk |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | d:\mysql-5.0.9-beta-win32\share\charsets/ |
+--------------------------+-------------------------------------------+
7 rows in set (0.00 sec)
mysql> show variables like 'collation%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | gbk_chinese_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
我们可以看到 set names 'gbk'改变了character_set_client, character_set_connection, character_set_results, collation_connection的值.
如果要单独指定collation_name,可以使用
SET NAMES 'charset_name' COLLATE 'collation_name'
另一种修改多个变量的命令是:
SET CHARACTER SET x 等价于:
SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;
你可以自己体验一下该命令带来的字符集变量值的变动。
那么character_set_server, character_set_database的值怎么修改呢?直接在命令行里修改是不起作用的。
最好的方式是在配置文件my.ini中直接修改,在[mysqld]项下边添加:
default_character_set=GBK
当然,你如果想尝试,使用mysqld-nt --default_character_set=GBK来启动数据库也未尝不可,但我并不推荐这么做。
my.ini文件的搜索顺序是:
在版本4.1.5之前,必须在c:\my.cnf or c:\Windows\my.ini下边,这个有待检验。
在后续版本里,my.ini缺省就在mysql的安装目录下边。
强调一点:mysql --default-character-set=gbk -u root
或 mysql --defaults-file=c:\my.ini -u root
在my.ini中添加如下内容
[mysql] or [client]
default-character-set=gbk
或mysql -u root再执行set names 'gbk'
这三者效果完全一样。
四、乱码的产生
乱码的产生主要是由于字符集变量设置的不一致造成的。
操作系统有一个在显示字符时要使用的locale变量,linux下使用locale命令可以看到。
windows下使用chcp可以看到,gbk对应的code page应该是936。
如果操作系统安装了当前字符集与目标字符集的转换表,则能正确显示目标字符集中的字符,否则就会出现乱码。
latin1对应的是iso8859_1字符集,默认情况下,可以与gbk相互转换,至少在操作系统一级是这样。
五.乱码的避免
最好让上述9个字符集变量值保持一致,或者至少"兼容",同时也要考虑到OS中locale的值。
当然:character_set_system例外,它是存储和表示元信息使用的字符集,一般都是ascii串,使用utf8和使用latin1基本一样,但是,如果使用中文,可能就另当别论了。下边说的全部变量是指除了character_set_system以外的其它变量。
这里推荐三个方案:
1. 全部使用latin1
但是在java程序中,它担着一定的风险,即在入库之前,需要将字符串从gbk转换到iso8859_1,出库以后,获取结果时,再从iso8859_1转到gbk.
否则会出现乱码。
这种方式比较适合于C代码,显示依赖于操作系统的locale.一般都不用转换。
2. 全中文支持,全部设置成gbk.
方法:
在my.ini中修改添加:(这个是必须的)
[mysqld]
default-character-set=gbk
在java程序里边使用"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=GBK"这样的url,表明使用GBK进行编码。
3. utf8字符集支持.
方法:
在my.ini中修改添加:
[mysqld]
default-character-set=utf8
在java程序里边使用"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"这样的url,表明使用GBK进行编码。
注意utf8与UTF-8的分别.
utf8的好处是java虚拟机可以自动将它与gbk进行转换,因而显示都不会有乱码。可是在控制台下(cmd),显示就有问题了
相关文章推荐
- UTF8默认编码下的MYSQL命令框中输入汉字显示乱码的问题
- mount命令以及mount ntfs硬盘权限权限与显示的问题 分类: shell ubuntu 2014-11-08 18:29 148人阅读 评论(0) 收藏
- 修改MySql默认编码 分类: 转载 2011-12-05 12:17 13657人阅读 评论(0) 收藏 举报 mysqlcharacter数据库databasevariables数据库服务器
- mysql中文乱码问题 分类: database 2013-08-15 14:03 330人阅读 评论(0) 收藏
- eclipse默认编码为GBK,修改为UTF8的方法ZZ 分类: Android安装及配置 2014-11-19 09:48 58人阅读 评论(0) 收藏
- js + php 处理 永远的敌人 特殊符号 1 在网页上的显示问题 分类: php javascript js 特殊符号 html实体显示 html 2014-03-27 17:55 350人阅读 评论(0) 收藏
- ubutun mysql 5.7 修改默认字符集为utf8 ,解决xshell连接显示乱码问题
- MySQL 解决ERROR 1045 (28000): Access deniedfor user datam@localhost (using password: YES)的问题 分类: database 2013-09-12 15:52 402人阅读 评论(0) 收藏
- Python 设置系统默认编码 分类: python基础学习 2013-12-11 10:04 212人阅读 评论(0) 收藏
- 连接mysql server 5.0 数据库的乱码问题,utf8编码,中文正确显示
- linux文本文件查看、显示命令 :cat head tail grep more less nl 分类: Ubuntu学习笔记 2015-07-28 20:25 55人阅读 评论(0) 收藏
- 基于点阵字库的汉字显示 分类: 中文信息处理 2015-01-15 14:08 359人阅读 评论(0) 收藏
- 【JAVA编码专题】深入分析 Java 中的中文编码问题 分类: B1_JAVA 2015-02-10 21:09 153人阅读 评论(0) 收藏
- JSP使用UTF-8链接MYSQL数据库(UTF8)乱码以及连接失败问题以及更改mysql默认编码
- Eclipse 乱码 解决方案总结(UTF8 -- GBK)ZZ 分类: Android安装及配置 2014-11-19 09:42 40人阅读 评论(0) 收藏
- Ubuntu下彻底卸载mysql、安装mysql、及MySQLdb模块 分类: ubuntu 问题总结 database 2014-01-23 13:49 2560人阅读 评论(0) 收藏
- mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)
- python字符串中包含Unicode插入数据库乱码问题 分类: Python 2015-04-28 18:19 342人阅读 评论(0) 收藏
- MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题 收藏 MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用
- MYSQL常用查命令 分类: 数据库 2010-09-28 13:57 513人阅读 评论(2) 收藏