深入浅出MySQL -- 字符集

字符集

  1. ascii: 变成国标ISO-646, 由7位编码, 包括大小写字母, 阿拉伯数字和标点符号, 33个控制符号。
  2. unicode
    1. 为了统一字符编码,iso 1984 推出iso-10646 字符集 又称ucs-4, 4个字节来表示字节, 分为组,面,行和格, 每个一个字节来代表。
    2. 1988年, 美国计算机协会成立unicode , 反对iso, 推出unicode 1.0, unicode 16, unicode-8
      1. utf – unicode transformation format 所写, 对于iso-10646 的0组0字面 字符(basic multi -lingual plan, bmp) 保持不变, 对于其他字符转化为2个16位的unicode 编码
      2. utf-8 主要省字节数, 因为大部分场景下,都是ascii 编码, 因此utf8 1字节兼容 ascii 字符集, 2字节 可以转化0X0080 ~ 0X07FF UCS-4, 3字节 用于ucs-4 0x0800 ~0xFFFF, 4字节用于0x00010000 ~ 0001ffff 原始码。
    3. image.png

image.png
image.png

1
mysql> show character set;


字符集character: 定义mysql 存储字符串的方式
校对规则collation: 定义 比较字符串的方式。 一个字符集,可以对应多个校对规则, 比如
image.png
校对规则命名规范: 字符集开始, 通常包括一个语言名, 以ci(大小写不敏感), cs(大小写敏感), bin(基于字符编码的值)


服务器默认字符集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
可以在 my.cnf 中设置:
[mysqld]
default-character-set=gbk
或者在启动选项中指定:
mysqld --default-character-set=gbk
或者在编译的时候指定:
./configure --with-charset=gbk


mysql> show variables like 'charactersetserver';
'character_set_server', 'utf8'

mysql>show variables like 'collation_server';
'collation_server', 'utf8_general_ci'


不能对已经存在数据的database 进行修改 字符集进行修改数据内容

  1. 如果指定了字符集和校对规则,则使用指定的字符集和校对规则;
  2. 如果指定了字符集没有指定校对规则,则使用指定字符集的默认校对规则;
  3. 如果没有指定字符集和校对规则,则使用服务器字符集和校对规则作为数据库的字

符集和校对规则。


显示当前数据库的字符集和校对规则

1
2
3
show variables like 'character_set_database';
show variables like 'collation_database';


表的字符集和校对规则, 类似数据库的定义方式
查看表的字符集和校对规则

1
mysql> show create table z1 

可以对一个列 进行单独的设置




对于应用来说, 还有3个不同的参数, character_set_client, character_set_connection, character_set_result.


通常情况下, 这3个参数应该一样, 否则会有乱码。 可以一次性全部设置

1
SET NAMES UTF8;


建议在my.cnf 中进行设置
[mysql]
default-character-set=utf8




字符串常量的字符集 是由 character_set_connection 参数来指定。
也可以手动强制进行设置

1
2
3
4
[_charset_name]'string' [COLLATE collation_name]

例如
mysql> select _gbk '字符集';


修改空数据库或空表的字符集和校对规则

1
2
alter database character set ***
alter table tablename character set ***


如果对一个已经有数据的进行调整

1
2
3
4
5
6
7
8
比如将一个latin1的字符集修改为gbk的字符集
1. 导出表结构 -- -d 只导出表结构, --default-character-set 设置怎么连接
mysqldump -uroot -p --default-character-set=gbk -d databasename> createtab.sql

2. 修改createtab.sql 中的字符集定义
3. 导出
mysqldump -uroot -p --quick --no-create-info --extended-insert
--default-character-set=latin1 databasename> data.sql

–quick:该选项用于转储大的表。它强制 mysqldump 从服务器一次一行地检索表中
的行而不是检索所有行,并在输出前将它缓存到内存中。
ƒ –extended-insert:使用包括几个 VALUES 列表的多行 INSERT 语法。这样使转储文件
更小,重载文件时可以加速插入。
ƒ –no-create-info:不写重新创建每个转储表的 CREATE TABLE 语句。
ƒ –default-character-set=latin1:按照原有的字符集导出所有数据,这样导出的文件中,
所有中文都是可见的,不会保存成乱码。


(4)打开 data.sql,将 SET NAMES latin1 修改成 SET NAMES gbk。
(5)使用新的字符集创建新的数据库。
create database databasename default charset gbk;
(6)创建表,执行 createtab.sql。
mysql -uroot -p databasename < createtab.sql
(7)导入数据,执行 data.sql。
mysql -uroot -p databasename < data.sq