建表和列类型又有什么关系呢?

分析: 再看上面的表,A4纸是数据的存储空间,而A4的大小是有限的.

请问:你准备给学号留多宽? 给姓名留多宽? 自我介绍又留多宽?

自然的, 姓名如果留的过宽,比如20个字都能存,但是一般人的姓名,就三四字---浪费了.

如果留的过窄,导致存不下,更有问题.

对应的,A4纸空间有限,硬盘空间也有限

我们建列时,自然想的是------能够容纳放置的内容,但是又不浪费.

存储同样的数据,不同的列类型,所占据的空间和效率是不一样的---这就是我们建表前要前列类型的意义。所以---重点学列类型的存储范围与占据的字节关系。

列类型

mysql三大列类型

数值型

整型:Tinyint/ smallint/ mediumint/int/ bigint(M) unsigned zerofill

整型系列所占字节与存储范围的关系.

定性: 占字节越多,存储范围越大.

下图: 是具体的数字分析




MySQL一个汉子占几个字符 mysql数字占几个字节_的date类型占几个字节


MySQL一个汉子占几个字符 mysql数字占几个字节_Text_02


MySQL一个汉子占几个字符 mysql数字占几个字节_的date类型占几个字节_03


字符串型

Char(M)

Varchar(M)

Text 文本类型

日期时间类型

Date 日期

Time 时间

Datetime 时间时间类型

Year 年类型

Mysql 字符串类型

Char 定长类型

Char(M) , M 代表宽度, 0<=M<=255之间

例:Char(10) ,则能输入10个字符.

Varchar 变长类型

Varchar(M), M代表宽度, 0<=M<=65535(以ascii字符为例,utf822000左右)

例:Varchar(10)

[2]张三

[3]二麻子

[4]司马相如

例:Char(8)

00000000

'Hello '

'hello '

Char(M)如何占据M个字符宽度?

答: 如果实际存储内容不足M个,则后面加空格补齐.

取出来的时候, 再把后面的空格去掉.(所以,如果内容最后有空格,将会被清除).

速度上: 定长速度快些

注意: char(M),varchar(M)限制的是字符,不是字节.

即 char(2) charset utf8, 能存2个utf8字符. 比如'中国'char与varchar型的选择原则:

1:空间利用效率, 四字成语表, char(4),

个人简介,微博140字, varchar(140)

2:速度

用户名: char

Char 与 varchar:


MySQL一个汉子占几个字符 mysql数字占几个字节_Text_04


Text : 文本类型,可以存比较大的文本段,搜索速度稍慢.

因此,如果不是特别大的内容,建议用char,varchar来代替.

Text 不用加默认值 (加了也没用).

Blob,是二进制类型,用来存储图像,音频等二进制信息.

意义: 2进制,0-255都有可能出现.

Blob在于防止因为字符集的问题,导致信息丢失.

比如:一张图片中有0xFF字节, 这个在ascii字符集认为非法,在入库的时候,被过滤了.

日期时间类型:

Year 年(1字节) 95/1995, [1901-2155],

在insert时,可以简写年的后2位,但是不推荐这样.

[00-69] +2000

[70-99] + 1900,

即: 填2位,表示 1970 - 2069

Date 日期 1998-12-31

范围: 1000/01/01 ,9999/12/31

Time 时间 13:56:23

范围: -838:59:59 -->838:59:59

datetime 时期时间 1998-12-31 13:56:23

范围: 1000/01//01 00:00:00 ---> 9999:12:31 23:59:59

timestamp

时间戳:

是1970-01-01 00:00:00 到当前的秒数.

一般存注册时间,商品发布时间等,并不是用datetime存储,而是用时间戳.

因为datetime虽然直观,但计算不便.


MySQL一个汉子占几个字符 mysql数字占几个字节_MySQL一个汉子占几个字符_05


这张表不够好,可以优化

分析:这张表除了username/intro列之外,每一列都是定长的.

我们不妨让其所有列,都定长,可以极大提高查询速度.


MySQL一个汉子占几个字符 mysql数字占几个字节_的date类型占几个字节_06


Username char(10) 是会造成空间的浪费,但是提高的速度,值.

Intro char(1500) 却浪费的太多了,另一方面,人的简介,一旦注册完,改的频率也并不高.

我们可以把 intro列单独拿出来,另放一张表里.


MySQL一个汉子占几个字符 mysql数字占几个字节_字符串_07