标签:blog mysql table 多实例 ima order 国际 中文 业务
本地windows 8.1
远程连接工具 SecureCRT 7.3
Linux发行版本 CentOS 6.7 x86_64位Linux系统,内核的版本为2.6.32-573
mysql版本 mysql-5.5.32
字符集就是一套文字符号及编码、比较规则的集合
MySQL数据库字符集包括字符集(CHARACTER)和校对规则(COLLATION)两个概念。其中,字符集是用来定义MySQL数据字符串的存储方式,而校对规则是定义比较字符串的方式。
常用字符集 |
一个汉字长度 |
说明 |
GBK |
2字节 |
不是国际标准,对中文环境支持的很好 |
UTF-8 |
3字节 |
中英文混合的环境,建议使用此字符集,用的比较多 |
latin1 |
1字节 |
MySQL的默认字符集 |
utf8mb4 |
4字节 |
UTF-8 Unicode,用于移动互联网 |
1) 如果处理各种各样的文字,发布到不同语言国家地区,应选择Unicode字符集,对mysql来说就是UTF-8(每个汉字3字节),更适合于多英文少中文
2) 如果只需要支持中文,并且数据量很大,性能要求也很高,可选GBK(定长,每个汉字占双字节,英文也占双字节),更适合于大量运算、比较排序,定长字符集,性能较高
3) 处理移动互联网业务,可能需要使用utf8mb4字符集
老师建议:没有特别需求,请选择UTF-8
mysql> show character set;
mysql> show variables like ‘character_set%‘;
想要不乱码,就要让上述字符集统一
set names gbk;
将3个客户端的字符集(1、2、5)改为gbk
相当于输入下面3条命令:
set character_set_client = gbk;
set character_set_results = gbk;
set character_set_connection = gbk;
[root@db02 ~]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock --default-character=gbk;
mysql> show variables like ‘character_set%‘;
永久生效,上面
[client]
default-character-set=gbk
注意:多实例的情况下,此步骤修改字符集,要修改/etc/my.cnf
[mysqld]
default-character-set=utf8 ##适合5.1及以前版本
character-set-server=uft8 ##适合5.5
重启服务后永久生效
这个修改影响的第3和第6个字符集,相当于修改
character_set_database
character_set_server
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \
不建议在有数据的库上修改,下面的命令对之前已经存在的数据无效,影响之后更新的数据
mysql> alter database oldboy character set latin1 collate = latin1_swedish_ci;
mysql> show create database oldboy\G
不建议在有数据的表上修改,下面的命令对之前已经存在的数据无效,影响之后更新的数据
mysql> alter table oldboy.test character set latin1;
mysql> show create table oldboy.test\G
建库
create database oldboy_utf8 default character set utf8 collate utf8_general_ci
建表
create table `student` (
`id` int(4) not null auto_increment,
`name` char(20) not null,
primary key (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
程序代码的编码要和库表统一,UTF-8无签名
cat /etc/sysconfig/i18n
$LANG的字符集要和数据库统一
更改SecureCRT工具的默认字符集为utf-8
1) 操作习惯
尽量不在MySQL命令行直接插入数据(SSH客户端影响),将SQL语句放到文件里
2) sql文件的格式
统一使用“uft8没有签名”
3) 导入文件方式
可在MySQL命令行中用source执行sql文件
命令方式导入数据mysql –uroot –poldboy123 oldboy <test.sql
4) 导入sql语句时设置客户端字符集
sql文件里加入set names utf8;
或者mysql –uroot –poldboy123 oldboy --default-character-set=uft8 <test.sql
思想:导出原库的表结构和数据,删除原库创建新库,将表结构和数据导入新库
mysqldump –uroot –poldboy123 --default-character-set=latin1 –d dbname >alltable.sql
--default-character-set=uft8表示以utf8字符集进行连接,-d只导表结构
表结构alltable.sql将所有latin1字符串改成utf8(可以用sed做个替换)
确保数据库不再更新,导出所有数据(不带表结构)
mysqldump –uroot –poldboy123 --quick --no-create-info --extended-insert --default-character-set =latin1 dbname >alldata.sql
参数说明:
--quick 用于转储大的表,强制mysqldump从服务器一次一行的检索数据而不是检索所有行,并输出前CACHE到内存中
--no-create-info 不创建CREATE TABLE语句
--extended-insert 使用包括几个VALUES列表的多行INSERT语法,这样文件更小,IO也小,导入数据时会非常快
--default-character-set =latin1 按照原有字符集导出数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码
调整客户端及服务端字符集,重启生效
删除原库,然后create database dbname default charset utf8;
导入的是更改过的字符集的表结构
mysql –uroot –poldboy123 dbname <alltable.sql
mysql –uroot –poldboy123 dbname <alldata.sql
PS:选择目录字符集时,要注意最好大于等于源字符集(字库更大),否则可能会丢失不被支持的数据
ssh远程连接linux下的MySQL数据库字符集和防止乱码
标签:blog mysql table 多实例 ima order 国际 中文 业务
原文地址:http://www.cnblogs.com/wenzhan/p/6784556.html