1.1mysql字符集知识:
概述:字符集就是一套文字符号及其编码,比较规则的集合。 Mysql数据库字符集包括字符集(character)和校对规则(collation)这两个概念。其中字符集用于定义mysql数据库的存储方式,而校对规则是定义字符串的比较方式,并且字符集和校对规则是一对多的关系
查看mysql可用的字符集的命令是show character set;
1.2mysql数据库使用常见字符集介绍:
常用·字符集 |
长度 |
说明 |
GBK |
2 |
不是国际标准,但支持的系统较多 |
UTF-8 |
3 |
中英文合并,建议使用此字符集 |
utf8mb4 |
4 |
UTF-8 Uniconde |
Lantin1 |
1 |
Mysql默认安装使用的字符集 |
1.3选择合适的字符集
1)满足应用支持语言的需求,处理各种各样的文字,支持不同语言的国家和地区,应选Unicode字符集,即utf-8。
2)处理数据量较大,且要支持中文,性能要求很高,可选GBK(定长字符集,占用两个字节)对大量运算处理,比较排序,更快,更高。
3)移动互联网业务,建议使用utf8mb4字符集。
2.1mysql字符集的设置
1)mysql默认情况下字符集的设置
show variables like 'character_set%'; +--------------------------+-------------------------------------------+ | Variable_name | Value | +--------------------------+-------------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /application/mysql-5.6.36/share/charsets/ |
2)linux服务器端
[root@db01 mysql]# cat /etc/sysconfig/i18n
LANG="zh_CN.UTF-8
3)临时修改mysql客户端字符集
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)
永久修改:
[client]
default-character-set=utf8
4)修改mysql服务器端字符集
在mysqld下添加default-character-set=utf8
Mysql5.5及其以后版本
[mysqld]
character-set-server=utf8
5)修改库表字符集的方法:
修改库:alter database databasename character set ******
修改表:alter table tablename character set ******
库的修改:
例如:show create database oldboyG;
*************************** 1. row ***************************
Database: oldboy
Create Database: CREATE DATABASE `oldboy` /*!40100 DEFAULT CHARACTER SET gbk */
1 row in set (0.00 sec)
oldboy数据库字符集目前是gbk,将其修改为utf8,命令如下;
alter database oldboy character set utf8 collate utf8_general_ci ;
表的修改:
alter table student character set utf8 collate utf8_general_ci ;
2.2生产环境中字符集的修改
说明:如何生产环境中没有调整好字符集的设定,而运行之后发现满足不了需求而调整,但不想丢失数据的话,可以进行字符集的修改,直接通过alter database databasename character set ******和alter table tablename character set ******命令进行修改,只能对修改后插入的数据有效,在修改之前插入的数据依然会保留之前的字符集,要想实现对之前数据也能修改字符集,必须将其数据导出,再经过调整重新导入即可。
模拟过程:
1) 导出表结构
mysqldump -uroot -p --default-character-set=utf8 -d oldboy>oldboy.sql
说明:--default-character-set=utf8 :以什么字符集连接 -d:只导出表结构,不导出数据
手工修改oldboy.sql表中的字符集为新的字符集。
2) 确保数据库不再更新数据,导出数据。
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=gbk oldboy>data.sql
参数说明:
--quick:功能是从服务器一次一行检索表中的行,而不是检索所有的行,并在输出前将它缓存到内存中,用于转储较大的表。
--extended-insert:使转储文件更小,重新载入文件可以加速插入。
--no-create-info:不会重新创建转储表create table语句。
--default-character-set=gbk:保留原有导出数据的字符集,这样导出的文件不会出现·乱码。
3)打开data.sql,将set names gbk 修改为 set names utf8
4)使用新的字符集创建新的数据库
show create database oldboy default charset utf8;
5)创建表结构,执行oldboy.sql。
mysql -uroot -p oldboy<oldboy.sql
6)重新导入数据u,执行data.sql。
mysql -uroot -p oldboy<data.sql