2015-09-22
  • 作者:tomfans
  • 本文地址:http://f-olivia.github.io/database/2015/09/22/mysql/
  • 转载请注明出处

#####二、字符串类型

1 固定长度(Fixed-width)

  • CHARACTER(length)
  • CHAR(length):是CHARACTER的简写,其中MYSQL还可以这么定义:NATIONAL CHAR

2 可变长度(Variable-length)

  • VARCHAR(length)
  • NATIONAL VARCHAR(length)

#####区别:跟字符集和系统参数sql_mode都有关系

1)长度,char:0~255;varchar:0-65535(255*255)
2)存储(Stored),
3)检索(retrieved)

表1:

CHAR(4)检索存储VARCHAR(4)存储检索
''' '''4bytes''1bytes''
'ab''ab ''ab'4bytes'ab'3bytes'ab'
'ab ''ab ''ab'4bytes'ab '3bytes'ab '
'abcd''abcd''abcd'4bytes'abcd'5bytes'abcd'
'abcdefgh''abcd''abcd'4bytes'abcd'5bytes'abcd'

从表1中得出以下结论: 表2:

CHAR(M)VARCHAR(M)备注
长度固定长度根据字符集自动换算长度,
该表当中所有之和<65535
跟字符集有关
存储固定长度,不足补空格;
超长的话, 根据sql_mode
进行报错,或自动截断
空字符,需要一个字节;
如果<255个字节,会增加一个
字节,记录长度;
如果>255个字节,会增加两个字节
跟sql_mode有关
检索取出来的值,会截取多余空格;
跟sql_mode有关
跟存储的内容一致跟sql_mode有关

具体请看实例: 如图1: Alt text

#####有关知识点: a、字符集,这个概念比较大,为了不影响本章主题,这里就不过多介绍,有时间会单独抽出一章来着重介绍

b、sql_mode:表示SQL运行在何种模式,

  • 查看:show variables like ‘sql_mode’; 或者 SELECT @@GLOBAL.sql_mode;SELECT @@SESSION.sql_mode;

  • 设置:SET GLOBAL sql_mode = ‘modes’;SET SESSION sql_mode = ‘modes’; 或者在配置文件my.cnf(unix)/my.ini(windows),写入sql_mode=”modes”;如果多个用”,”隔开

  • 几类常见的模式:STRICT_TRANS_TABLES、STRICT_ALL_TABLES、PAD_CHAR_TO_FULL_LENGTH等

  • 参考:refman-5.6-en.a4,Section 5.1.7, “Server SQL Modes”

关于sql_mode具体操作如下: 如图2: Alt text

c、常用命令:

查看表结构:

desc(describe) table_name;
explain table_name;
show columns from table_name;
show create table table_name;(这个可以查看表的定义)

举例:创建表t_desc

mysql> create table t_desc(
-> col1 char(6) not null default '',
-> col2 character(6),
-> col3 varchar(6),
-> col4 national varchar(6));

具体操作请看, 如图3:
Alt text

d、问题:根据mysql参考文档中,varchar(4),如果实际存储‘abcd’,存储长度是5,怎么查看?

3 二进制(BINARY)和可变长度二进制(VARBINARY)

#####区别:跟系统参数sql_mode都有关;与字符集无关

1)长度,BINARY:0~255;VARBINARY:0-65535
2)存储:单个字节存储的,所以跟字符集无关
3)如果,sql_mode指定为空,超过指定长度存储,会报警告,且自动截断;如果指定为STRICT_TRANS_TABLE,则会报错
4)如果,存储值长度不够,用0字节(0x00)补全;

具体请看, 如图4:
Alt text

4 二进制大对象(BLOB)和文本大对象(text)

该数据类型没有太多介绍,只是存储备注等需要更长描述性字段,涉及2个参数:

  • max_sort_length:进行排序和分组有意义的字节长度
  • max_allowed_packet:客户端与服务器端通讯缓存包大小

#####区别:列出二进制字符和非二进制字符

  • 非二进制字符串 > char(0-255)
    > varchar(0-65535)
    > text(0-65535)
    > TINYTEXT(0-255)
    > MEDIUMTEXT(0-16777215)
    > LONGTEXT(0-4294967295)

  • 二进制字符串 > BINARY(0-255)
    > VARBINARY(0-65535)
    > TINYBLOB(0-255)
    > BLOB(0-65535)
    > MEDIUMBLOB(0-16777215)
    > LONGBLOB(0-4294967295)

5 枚举型(ENUM)和SET字符串对象

1)长度:ENUM(0-65535);SET(64个不同成员)
2)ENUM只能有一个,空串或者为null;SET可以多个值
3)ENUM索引值为自然值,0表示这是非法值;SET索引值为该实际值的二进制编码
4)存储NUMBER类型,也是用引号引起来

具体请看实验吧: 如图5:
Alt text


Alt text



blog comments powered by Disqus