如果mysql数据库在运行一段时间后(不能满足现有需求),需要调整数据库的字符集。在调整数据库字符集要注意:目标数据库的字符集要源数据库的父集,这样在转换中,数据才不会丢失。Alter database character set及alter table character set不会更新已有的记录的字符集。
从gb2312字符集修改成gbk的步骤:
mysql> create database luoxuan default charset gb2312;
mysql> use luoxuan
Database changed
mysql> create table test_charset
-> (i smallint not null auto_increment,
-> name varchar(10),primary key(i))
-> engine=myisam charset=gb2312 ;
Query OK, 0 rows affected (0.05 sec)
插入两条记录:
insert into test_charset values(1,’李杰’) —-支持gb2312
insert into test_charset values(2,’郎郎’) —-不支持gb2312,支持gbk
mysql> select * from test_charset;
+—+——+
| i | name |
+—+——+
| 1 | 李杰 |
| 2 | ?? |
+—+——+
2 rows in set (0.00 sec)
1、 导出表结构
[root@blog etc]# mysqldump -uroot -p*** –default-character-set=gbk -d luoxuan>createts.sql
在使用mysqldump过程遇到点两个问题:
一、
[root@blog etc]# mysqldump -uroot -p*** –default-character-set=gbk -d luoxuan>createts.sql
mysqldump: unrecognized option `–max_allowed_packet=16M’
说明这个版本的mysqldump不支持max_allowed_packet,修改my.cnf,屏蔽。
二、
[root@blog etc]# mysqldump -uroot -p*** –default-character-set=gbk -d luoxuan>createts.sql
mysqldump: Got error: 1251: Client does not support authentication protocol requested by server;
consider upgrading MySQL client when trying to connect
解决办法:
mysql>set password for xxx@hostname=old_password(‘yyy’);
mysql>flush privileges;
或直接更新权限表
mysql>UPDATE mysql.user SET Password = OLD_PASSWORD(‘newpwd’)
WHERE Host = ‘host’ AND User = ‘user’;
mysql>FLUSH PRIVILEGES;
2、 手工修改createts.sql中表结构定义,定义为gbk
3、 停止服务,导出所有记录
[root@blog etc]# mysqldump -uroot –p*** –quick –no-create-info –extended-insert –default-character-set=gb2312 luoxuan > data.sql
4、 修改data.sql文件,增加或修改为SET NAMES GBK
5、 新建数据库
mysql> create database xiyan default charset gbk;
Query OK, 1 row affected (0.00 sec)
6、 导入表
[root@blog etc]# mysql -uroot –p*** xiyan < createts.sql
7、 导入数据
[root@blog etc]# mysql -uroot –p*** xiyan < data.sql
8、 检查
mysql> use xiyan;
Database changed
mysql> show tables;
+—————–+
| Tables_in_xiyan |
+—————–+
| test_charset |
+—————–+
1 row in set (0.00 sec)
mysql> select * from test_charset;
+—+——+
| i | name |
+—+——+
| 1 | 李杰 |
| 2 | ?? |
+—+——+
2 rows in set (0.00 sec)
再执行插入:
insert into test_charset values(2,’郎郎’);
mysql> select * from test_charset;
+—+——+
| i | name |
+—+——+
| 1 | 李杰 |
| 2 | ?? |
| 3 | 郎郎 |
+—+——+
3 rows in set (0.00 sec)