跟我一起学习MySQL技术内幕(第五版):(第三章学习日记8)

(补2)(single dog single day 人丑就要多读书)
3.2.5.5字符串数据类型属性
3.2.5.6选择字符串数据类型
___________________________________

3.2.5.5字符串数字类型属性

字符串数字类型特有的属性有 character set(或charset) 和collate分别用于指定字符集排序规则.你可以把他们指定为自身的默认选型,也可以指定为各个的单独选项,从而改写表的默认选项.

character set和collate属性适用的数据类型有char varchar text enum 和set. 它们并不适用于二进制串数据类型(binary,varbinary,blob)因为这些数据类型包含的是字节串而非字符串.

在指定character set 和collate 属性时,不管是在列,表,数据库这三级别中的哪一级,都要遵从以下规则.

1.使用的字符集必须是服务器支持的.使用show character set 语句可以查出当前可用的字符集
2.如果定义里同时使用了character set 和collation属性,那么他们所代表的字符集和排序规则必须要相兼容.show collation语句可以把每一种字符集所支持的排序顺序显示出来
3.如果定义里只有character set 而没有collation 则使用默认规则排序
4.使用collate而没有 character set 具体的字符集就要由排序规则名的第一部分来确定

通过下面这条语句,可以看到上述规则的应用情况.

create   table mydatabase.mytb1
(
    c1 cahr(10),
    c2 char(40) character set latin2,
    c3 char(10) collate latin_german1_ci,
    c4 binary(40)
)character set utf8

如果想要查看某个已有表的字符集信息,那么可以使用show create table 语句:

show create table mytb1\G

如果show create table 没有显示列的字符集,则表明它与表的默认字符集相同.如果他没有显示列的排序规则,表明该列的排序规则与该列的字符集默认排序规则相同

也可以使用show columns 语句加上关键字full,用于显示排序规则信息(可以根据它图丢暗处具体的字符集)

show full columns from mytab1;

前面的讨论只提到了列和表的字符集设置情况,其实字符集还可以在列,表,数据库和服务器等多个级别进行指定,在MySQL处理字符列的定义时,会依次根据下述原则为它确定使用何种字符集.

1.如果列的定义里指定了字符集,那么使用这个字符集.
2.否则,如果表的定义里有字符集选项,那么使用这个字符集.
3.否则,把数据库的字符集座位表的默认字符集,该字符集还会成为列的默认字符集.如果数据库也没有显示指定字符集,那么将沿用服务器的数据库字符集.

MySQL在确定字符集时,会向上搜索可能指定字符集的各个层级,直到他找到某个定义的字符集为止,然后将它用于该列.数据库始终有一个默认字符集所以这一搜索过程肯定也会到达数据库级别终止.

binary字符集比较特殊.当将某个非二进制串列指定为binary字符集时,相当于把该列定义为相应的二进制串类型.下面的几对定义都是等价的

 c1 char(10)character set binary
 c1 binary(10)

 c2 carchar(10) character set binary 
 c2 varbinary(10)

 c3 text character set binary
 blob  

如果为某个二进制串列指定了character set binary 那么它将会被忽略,因为该类型已经是二进制类型了.如果为enum或set列指定了character set binary 那么它将像前面讨论的那样发挥作用.

如果把binary字符集赋值为表选项,那么它将应用到所有在其定义里没有指定任何字符集信息的字符串列.

对于字符列定义的属性,MySQL还提供了多种简写形式

1.ascii 属性 是 character set latin1的 简写
2.unicode 属性是character set ucs2 的简写
3.对于非二进制串列,enum,或set列,如果指定binary属性,则等同与在指定该列字符集的 二进制排序规则 .例如,某个表的默认字符及是latin1,则以下这些定义是等效的
c1 char(10) bianry
c2 char(10) character set latin1 binary
c3 char(10) character set latin1 collate latin_bin

3.2.5.6选择字符串数据类型
在为字符串选择是数据类型时,要考虑以下几个问题

1.这些值是要表示为字符数据,还是二进制数据
2.比较创造做需要区分大小

字符数据则需要选择非二进制类型.二进制数据则选择二进制串类型

区分大小写则应选择非二进制串类型,这些存储字符是与字符集和排序规则相关联的.

非二进制串在比较和排序时是否区分大小写,受制于为他们所指定的排序规则.

如果不想区分大小写,则应该选用一种不区分大小写的排序规则.

否则,应该选用一种二进制排序规则或区分大小写的排序规则.

二进制排序规则在比较两个字符时,使用的是他们的数字编码.区分大小写的排序规则则在比较两个字符时,使用的是这种排序规则特有的字符顺序—-不一定与字符编码的大小顺序相同.

如果需要使用到的列里既有区分大小的比较也有不区分大小的比较,则使用的排序规则要与你最长执行的比较类型相对应

对于其他类型的比较,可以利用collate运算符来更改排序规则

mycol collate latin_genaral_cs = 'ABC'
mycol collate latin_bin = 'ABC'
mycol = 'ABC' collate latin_genanral_cs
mycol ='ABC' collate latin1_bin
3.想要少占用存储空间吗?可以选择可变长度类型
4.列的取值总是从固定的某些值里选取么?如果是,可以选择enum或者set类型
5.尾部的填充很重要吗?如果数据必须原样存入和取出,不能增加和移除尾部的空格(对于二进制是0x00)那么应该用text或者varchar来存放非二进制串.(当想要存储去压缩数据散列数据或者加密数据这一点非常关键,因为他们的编码方式可能导致尾部空格)
    数据类型                 存储        检索         结果
char                        填充空格     去掉        检索值无尾部填充
binary                      填充00x0     不处理      检索值会保留尾部填充
varchar  varbinary          不处理       不处理      尾部填充无变化
text     blob               不处理       不处理      尾部填充无变化

启用SQL的模式pad_char_to_full_length可以让检索出来的char列值保留尾部空格

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值