本地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 4) 导入sql语句时设置客户端字符集 sql文件里加入set names utf8; 或者mysql –uroot –poldboy123 oldboy --default-character-set=uft8 思想:导出原库的表结构和数据,删除原库创建新库,将表结构和数据导入新库 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 mysql –uroot –poldboy123 dbname PS:选择目录字符集时,要注意最好大于等于源字符集(字库更大),否则可能会丢失不被支持的数据 1、默认情况下,不对mysql字符集作任何设置,mysql的所有字符集默认是latin1(ISO_8859_1) 2、mysql字符编码主要分做两部分:客户端和服务器端(可在[client] 和 [mysqld] 中永久设置更改) (1)客户端包括 set character_set_client、set character_set_results 、set character_set_connection ; (2)服务器端包括 set character_set_server、set character_set_database; 3、数据库主要分系统级、数据库级、表级、字段级 字段级 > 表级 > 数据库级 > 系统级,所以以每个表中的字段字符集为准(优先级高); 客户端要与字段级或表级保持一致,可以防止乱码; 4、执行SQL语句时信息的路径是这样的: 5、产生乱码的根本原因 1.6 更改已有数据的数据库字符集
1.6.1 导出表结构
1.6.2 编辑表结构语句
1.6.3 导出数据
1.6.4 修改my.cnf配置
1.6.5 通过utf8建库
1.6.6 导入表结构
1.6.7 导入数据
注意:
信息输入路径:client→connection→server;
信息输出路径:server→connection→results.