Mysql学习笔记四,字符集

来源:互联网 发布:什么是java反射机制 编辑:程序博客网 时间:2024/06/05 02:38

字符集概述

字符集: 一套文字符号及编码、比较规则的集合。
ASCII: 最早的标准字符集, 包含英文字母、阿拉伯数字、标点符号和33个控制字符。定长,一个字符7位编码。
Unicode: 为了统一各种语言,基本能包括所有已知再用的字符。 一个字符4个字节编码。UTF-8/UTF-16 定义了这个4个字节的编码在计算机中如何表示(如部分ASCII可以单字节表示, 等等)
UTF-8: 非定长,1-4字节编码。互联网上广泛支持的Unicode编码方式。

汉字及常见字符集

GB2312-80: 1980年发布, 定长,双字节编码, 收录了 6763 个常用汉字和 682个非汉字图形符号。
GBK: 完全兼容GB2312, 定长,双字节编码,收录了20902+增补的52个汉字。
GB18030: 扩展了GBK,非定长,相同部分双字节编码,其他四字节编码,收录27,484CJK汉字。

Mysql上如何选择字符集

  1. 如需支持多国语言,选择UTF-8。
  2. 如果只支持中文,且中文很多, 又要求性能高, 可以选择GBK。因为GBK对中文是双字节编码,UTF-8是三字节编码。但是如果大部分都是英文,选择UTF-8优于GBK, 英文在UTF-8中是单字节编码,在GBK中是双字节编码。
  3. 定长相较于非定长,在做字符运算(比较、排序)时效率更高。

Mysql 可以针对底层的对象如一个表的某一个字段来指定它的字符集。
每个字符集都有多个校对规则。校对规则决定了字符串比较方式。以gbk为例:
*_ci: 大小写不敏感,*_cs: 大小写敏感,*_bin: 基于字符编码比较。

 show character set; --查看MySql支持的字符集 show collation like 'gbk%'; --查看gbk的校对规则

设置Mysql的字符集

四个级别:服务器级、数据库级、表级、字段级
- 服务器字符集和校对规则
1 my.cnf中设置
[mysqld]
default-character-set=gbk
2 启动选项时指定:
mysqld –default-character-set=gbk
3 编译时指定:
./configure –with-character=gbk
指定字符集的时候,可以同时指定对应的校对规则(如果你使用该字符集非默认的校对
规则)
如果没有指定字符集,那么会默认使用latin1。

show variables like 'character%';--查看默认字符集show variables like 'collation%';--查看默认校对规则
  • 数据库级字符集和校对规则
    1 创建数据库的时候指定。
    2 可以通过alter database 来修改,修改不会对已有数据产生影响。

  • 表级字符集和校对规则
    1 创建表的时候指定。
    2 可以通过alter table来修改,修改不会对已有数据产生影响。

show create table t1;--查看t1的默认字符集和校对规则
  • 列级字符集和校对规则
    1 创建表的时候指定。
    2 可以通过alter table来修改,修改不会对已有数据产生影响。
    3 如果不指定,默认使用表的定义。

  • 连接字符集和校对规则
    客户端和服务器的交互操作,MylSQL 提供了 3 个不同的参数:character_set_client、
    character_set_connection 和 character_set_results, 分别代表客户端、 连接和返回
    结果的字符集, 可以使用

set names utf8; --本次连接使用的字符集, 同时指定上述三个参数。

还可以指定字符串常量字符集:

select _gbk '测试';--字符串常量指定字符集
  • 字符集修改步奏
    希望修改字符集,但又担心已有数据修改不了,可以按照下面步奏:
    (1)导出表结构:
    mysqldump -uroot -p --default-character-set=gbk -d databasename>
    createtab.sql
    其中–default-character-set=gbk 表示设置以什么字符集连接, -d 表示只导出表
    结构,不导出数据。

(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.sql
* 目标字符集最好是源字符集的超集。

0 0
原创粉丝点击