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;

ssh远程连接linux下的MySQL数据库字符集和防止乱码_第1张图片

1.2 查看系统当前使用的字符集

mysql> show variables like 'character_set%';

 ssh远程连接linux下的MySQL数据库字符集和防止乱码_第2张图片

想要不乱码,就要让上述字符集统一

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 登录数据库时更改客户端字符集,效果同上

[root@db02 ~]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock --default-character=gbk;

mysql> show variables like 'character_set%';

 ssh远程连接linux下的MySQL数据库字符集和防止乱码_第3张图片

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

4)        导入sql语句时设置客户端字符集

sql文件里加入set names utf8;

或者mysql –uroot –poldboy123 oldboy --default-character-set=uft8

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

1.6.7 导入数据

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语句时信息的路径是这样的:
            信息输入路径:client→connection→server;
            信息输出路径:server→connection→results.

5、产生乱码的根本原因  

  1. 客户机没有正确地设置client字符集,导致原先的SQL语句被转换成connection所指字符集,而这种转换,是会丢失信息的,如果client是utf8格式,那么如果转换成gb2312格式,这其中必定会丢失信息,反之则不会丢失。一定要保证connection的字符集大于client字符集才能保证转换不丢失信息。
  2. 数据库字体没有设置正确,如果数据库字体设置不正确,那么connection字符集转换成database字符集照样丢失编码,原因跟上面一样。

你可能感兴趣的:(MySql)