mysql字符集与校对规则设置_MySQL 字符集与校对规则

1.创建对象时的默认值MySQL 的设置可以分为两类 , 创建对象时的默认值 , 在服务器和客户端通信时的设置 .

MySQL 服务器有默认的字符集和校对规则 , 每个数据库也有自己的默认值 . 每个表也有自己的默认值 . 这是一个集成的默认设置 . 最终最靠底层的默认值将影响创建的对象 .

至上而下的告诉 MySQL 应该使用什么字符集来存储某个列 .

每一层 , 都可以指定一个特殊的字符集或让服务器使用它的默认值 :

在创建数据库的时候 , 将根据服务器上的 sharacter_set_server 设置来设定该数据库的默认字符集 .

创建表的时候 , 将根据数据库的字符集设置来指定这个表的字符集设置 .

( CREATE DATABASE IF NOT EXISTS my_dbdefault charset utf8 COLLATE utf8_general_ci )

当 use database 时 , character_set_database ( show variables ) 会变为创建表时所设置的默认变量 , 当未选择任何库时 ,  character_set_database 于 sharacter_set_server 相等 .

创建列的时候 , 将根据表的设置指定列的字符集设置 .

真正存放数据的是列 , 所以更高 " 阶梯 " 的设置只是指定默认值 . 一个表的默认字符集设置无法影响存储在这个表中的某个列的值 . 只有当创建列而没有为列指定字符集的时候 , 表的默认字符集才有作用 .

2 . 服务器和客户端通信时的设置

当服务器和客户端通信的时候 , 他们可能使用不同的字符集 . 此时 , 服务器端将进行必要的翻译转换工作 .

服务器总是假设客户端按照 character_set_client 设置的字符来传输数据和 SQL 语句 .

当服务器收到客户端的 SQL 语句时 , 它先将其转换成字符集 character_set_connection . 它还使用这个设置来决定如何将数据转换为字符串 .

当服务器端返回数据或者错误信息给客户端时 , 它会将其转换为 character_set_result .

以上值可以通过 SET NAMES 或者 SET CHARACTER 来改变 ( 注 : 该命令会一次改变所有三个变量的值 , 即 : character_set_client , character_set_connection , character_set_result 会同时改变为所设值 ) .

在 php 中 , 可以使用 mysql_set_charset() 来修改客户端的字符集 .

可使用前缀和 COLLATE 子句来指定字符串的字符集或者校对字符集 , 例如 , 下面的示例使用了前缀 ( 下划线 ) 来指定 UTF8 字符集 , 还使用 COLLATE 子句指定使用二进制校对规则 .SELECT _utf8 'hello world' COLLATE utf8_bin;

3 . 选择字符集和校对规则

MySQL 4.1 和之后的版本支持很多的字符集和校对规则 , 包括支持使用 Unicode 编码的多字节 UTF-8 字符集 ( MySQL 支持 UTF-8 的一个三字节子集 , 这几乎可以包含世界上的所有字符集 ) . 可以使用 SHOW CHARACTERSET 和 SHOW COLLATION 来查看 MySQL 支持的字符集和校对规则 .

对于校对规则通常需要考虑一个问题 , 是否以大小写敏感的方式比较字符串 , 或者是以字符串编码的二进制值来进行比较大小 . 他们对应的校对规则的前缀分别为 _cs , _ci 和 _bin 根据需要很容易选择 . 大小写敏感和二进制校对规则不同之处在于 , 二进制校对规则直接使用字符的字节进行比较 , 二大小写敏感的校对规则在多字节字符集时 , 有更复杂的比较规则 .

创建表时可以如下方式显示的置顶字符集和校对规则 .

CREATE TABLE t ( col1 CHAR(1), col2 CHAR(1) CHARSET utf8, col3 CHAR(1) COLLATE latin1_bin ) DEFAULT CHARSET=cp1251;

字符集和校对规则如何影响查询

只有排序查询要求的字符集和服务器数据的字符集相同的时候 , 才能使用索引进行排序 . 索引根据数据列的校对规则进行排序 . 假设某列使用的校对规则为 utf8_general_ci 如果使用别的校对规则进行排序 , 如 utf8_bin  那么 , 就必须使用文件排序 .

当使用两个字符集不同的列来关联两个表时 , MySQL 会尝试转换其中一个列的字符集 . 这和在数据列外面封装一个函数一样 . 会让 MySQL 无法使用这个列上的索引 . 如果不确定 MySQL 内部是否做了这样的转换 , 可以在 EXPLAIN EXTENDED 后使用 SHOW WARNINGS 来查看 MySQL 是如何处理的 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值