mysql字符集、乱码_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1843 | 回复: 0   主题: mysql字符集、乱码        下一篇 
tk
注册用户
等级:中士
经验:207
发帖:80
精华:0
注册:2011-10-19
状态:离线
发送短消息息给tk 加好友    发送短消息息给tk 发消息
发表于: IP:您无权察看 2015-9-17 17:20:35 | [全部帖] [楼主帖] 楼主

一、MySQL字符集和校对规则

我们都知道,字符集就是一套文字符号及其编码、比较规则的集合,因为计算机只认识二进制代码,所以必须要有一个转换。

MySQL的字符集包括字符集(Character Set)和校对规则(Collation)两个概念。字符集是用来定义MySQL存储字符串的方式,而校对规则则定义了比较字符串的方式。

字符集和校对规则是一对多的关系,每个字符集至少对应一个校对规则,称为默认校对规则。

查看所有字符集的命令:show character set;

或是查看information_schema.character_sets,可以得到所有的字符集和它的默认的校对规则,它的表结构:desc information_schema.character_sets;

查看字符集的校对规则:show collation like 'GBK%';

校对规则命名约定:以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元,即比较是基于字符编码的值而与语言无关)结束。

实验命令:

select case when 'A' COLLATE utf8_general_ci = 'a' COLLATE utf8_general_ci then 'YES' else 'NO' end;(YES)
select case when 'A' COLLATE gbk_chinese_ci = 'a' COLLATE gbk_chinese_ci then 'YES' else 'NO' end;(YES)
select case when 'A' COLLATE gbk_bin = 'a' COLLATE gbk_bin then 'YES' else 'NO' end;(NO)


二、设置字符集

MySQL的字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和字段级。

服务器级:

[mysqld]
default-character-set=utf8
[mysql]
default-character-set=utf8


或是启动时加上参数:mysqld --default-character-set=utf8

或是编译时加上参数:./configure --width-charset=utf8

查看字符集和校对规则:

show variables like 'character_set_server';
show variables like 'collation_server';


数据库级:

查看字符集和校对规则:

show variables like 'character_set_database';
show variables like 'collation_database';


表级:

查看字符集和校对规则:

show create table t \G


四、简单修改字符集

简单修改只对以后的数据有影响,如果数据库中没有数据或是不想修改以前的数据,可以使用简单修改。

简单修改命令:

alter database character set utf8;
alter table t character set utf8;


个人推荐在创建数据库时明确指定字符集和校对规则,避免受到默认值的影响。

创建数据库时指定:

create database databasename default charset GBK;


创建数据表时指定:

create table tablename(
....
) ENGIND=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


五、完全修改字符集

当数据库中已有数据,想修改数据集,不能通过简单的修改字符集完成,需要先将原数据导出,经过适当调整后重新导入才可完成。

通过七步完成字符集的完全修改(假设原字符集是latin1,想修改成GBK)。

1、导出表结构:

mysqldump -uroot -p --default-character-set=GBK -d databasename>createdb.sql


说明:

--default-character-set=GBK 表示设置以什么字符集连接;

-d 表示只导出表结构,不导出数据。

2、手工修改createdb.sql中表结构定义中的字符集(latin1)为新的字符集(GBK);

3、确保数据库中的数据不再更新,导出所有的数据:

mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 databasename>data.sql


说明:

--quick 该选项用于转储大的表,它强制mysqldump从服务器一次一行地检索表中的行而不是检索所有行,并在输出前将它缓存到内存中;
--extended-insert 使用包括几个values的多行insert语法;
--no-create-info 不要create table语句;
--default-character-set=latin1 表示按照原有的字符集导出所有的数据。


4、打开data.sql,将set names latin1修改成set names GBK;

5、使用新的字符集创建数据库:

create database databasename default charset GBK;


6、创建表:

mysql -uroot -p databasename < createdb.sql


7、导入数据:

mysql -uroot -p databasename < data.sql


六、最后

建议服务器的字符集参数不要修改,而是是创建数据库进加上字符集,特别是在创建表时记得加上,这样做的目的是为了使修改的影响最小化。

--转自北京联动北方科技有限公司



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论