ssh远程连接linux下的MySQL数据库字符集和防止乱码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ssh远程连接linux下的MySQL数据库字符集和防止乱码相关的知识,希望对你有一定的参考价值。
实验环境:
本地windows 8.1
远程连接工具 SecureCRT 7.3
Linux发行版本 CentOS 6.7 x86_64位Linux系统,内核的版本为2.6.32-573
mysql版本 mysql-5.5.32
1.1 MySQL数据库字符集介绍
字符集就是一套文字符号及编码、比较规则的集合
MySQL数据库字符集包括字符集(CHARACTER)和校对规则(COLLATION)两个概念。其中,字符集是用来定义MySQL数据字符串的存储方式,而校对规则是定义比较字符串的方式。
1.1.1 在互联网环境中,使用MySQL时常用的字符集有
常用字符集 |
一个汉字长度 |
说明 |
GBK |
2字节 |
不是国际标准,对中文环境支持的很好 |
UTF-8 |
3字节 |
中英文混合的环境,建议使用此字符集,用的比较多 |
latin1 |
1字节 |
MySQL的默认字符集 |
utf8mb4 |
4字节 |
UTF-8 Unicode,用于移动互联网 |
1.1.2 MySQL如何选择合适的字符集
1) 如果处理各种各样的文字,发布到不同语言国家地区,应选择Unicode字符集,对mysql来说就是UTF-8(每个汉字3字节),更适合于多英文少中文
2) 如果只需要支持中文,并且数据量很大,性能要求也很高,可选GBK(定长,每个汉字占双字节,英文也占双字节),更适合于大量运算、比较排序,定长字符集,性能较高
3) 处理移动互联网业务,可能需要使用utf8mb4字符集
老师建议:没有特别需求,请选择UTF-8
1.1.3 查看当前MySQL系统支持的字符集
mysql> show character set;
1.2 查看系统当前使用的字符集
mysql> show variables like ‘character_set%‘;
想要不乱码,就要让上述字符集统一
1.3 更改客户端的字符集
1.3.1 进入数据库后更改客户端字符集
set names gbk;
将3个客户端的字符集(1、2、5)改为gbk
相当于输入下面3条命令:
set character_set_client = gbk;
set character_set_results = gbk;
set character_set_connection = gbk;
1.3.2 登录数据库时更改客户端字符集,效果同上
[[email protected] ~]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock --default-character=gbk;
mysql> show variables like ‘character_set%‘;
1.3.3 修改配置文件my.cnf
永久生效,上面
[client]
default-character-set=gbk
注意:多实例的情况下,此步骤修改字符集,要修改/etc/my.cnf
1.4 更改服务端字符集
1.4.1 修改配置文件my.cnf
[mysqld]
default-character-set=utf8 ##适合5.1及以前版本
character-set-server=uft8 ##适合5.5
重启服务后永久生效
这个修改影响的第3和第6个字符集,相当于修改
character_set_database
character_set_server
1.4.2 在编译的时候指定服务端字符集
-DDEFAULT_CHARSET=utf8 \\
-DDEFAULT_COLLATION=utf8_general_ci \\
-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \\
1.4.3 命令行修改库的字符集
不建议在有数据的库上修改,下面的命令对之前已经存在的数据无效,影响之后更新的数据
mysql> alter database oldboy character set latin1 collate = latin1_swedish_ci;
mysql> show create database oldboy\\G
1.4.4 命令行修改表的字符集
不建议在有数据的表上修改,下面的命令对之前已经存在的数据无效,影响之后更新的数据
mysql> alter table oldboy.test character set latin1;
mysql> show create table oldboy.test\\G
1.5 防止乱码,统一其它地方
1.5.1 建表建库的时候注意统一字符集
建库
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
1.5.2 程序
程序代码的编码要和库表统一,UTF-8无签名
1.5.3 linux服务端
cat /etc/sysconfig/i18n
$LANG的字符集要和数据库统一
1.5.4 连接工具CRT的字符集
更改SecureCRT工具的默认字符集为utf-8
1.5.5 在数据库中执行sql语句的方法
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
1.6 更改已有数据的数据库字符集
思想:导出原库的表结构和数据,删除原库创建新库,将表结构和数据导入新库
1.6.1 导出表结构
mysqldump –uroot –poldboy123 --default-character-set=latin1 –d dbname >alltable.sql
--default-character-set=uft8表示以utf8字符集进行连接,-d只导表结构
1.6.2 编辑表结构语句
表结构alltable.sql将所有latin1字符串改成utf8(可以用sed做个替换)
1.6.3 导出数据
确保数据库不再更新,导出所有数据(不带表结构)
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 按照原有字符集导出数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码
1.6.4 修改my.cnf配置
调整客户端及服务端字符集,重启生效
1.6.5 通过utf8建库
删除原库,然后create database dbname default charset utf8;
1.6.6 导入表结构
导入的是更改过的字符集的表结构
mysql –uroot –poldboy123 dbname <alltable.sql
1.6.7 导入数据
mysql –uroot –poldboy123 dbname <alldata.sql
PS:选择目录字符集时,要注意最好大于等于源字符集(字库更大),否则可能会丢失不被支持的数据
以上是关于ssh远程连接linux下的MySQL数据库字符集和防止乱码的主要内容,如果未能解决你的问题,请参考以下文章