场景介绍:

  1. 我们在设计数据库时候,总是不可避免的使用的varchar来作为表的字段,但是表长度应该多少呢?
  2. 我们很多时候使用varchar来做字段,为什么不用char?
  3. 每个字段类型可以表示的数据是多少?
  4. 设置多长字段符合业务需求?

在网上找到了,一些文章,所以写下自己的一些日记。

1,varchar(100)能存多少个汉字?

具体还是要看版本的,一个字符占用3个字节 ,一个汉字(包括数字)占用3个字节=一个字符

(1)MySQL 4.0版本以下

varchar(100),指的是100字节,如果存放UTF8汉字时,只能存33个(每个汉字3字节)。

(2)MySQL 5.0版本以上

varchar(100),指的是100字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放100个。

(3)编码格式相关说明:

UTF8编码中一个汉字(包括数字)占用3个字节
GBK编码中一个汉字(包括数字)占用2个字节

(4)位,字节和字符转换关系:

(a)位:

数据存储的最小单位。每个二进制数字0或者1就是1个位;

(b)字节:

8个位构成一个字节;

即:1 byte (字节)= 8 bit(位);
也就说:1 byte(字节)=255(数字长度)

1 KB = 1024 B(字节);
1 MB = 1024 KB; (2^10 B)
1 GB = 1024 MB; (2^20 B)
1 TB = 1024 GB; (2^30 B)

(c)字符:

a、A、中、+、*、の…均表示一个字符;
一般 utf-8 编码下,一个汉字 字符 占用 3 个 字节;数字属于汉字,和汉字占用一样字节。
一般 gbk 编码下,一个汉字 字符 占用 2 个 字节;

(5)字段类型及其对象

(a)数据类型

列类型(大写)

列类型(小写)

需要的存储量

数值

无符号

TINYINT

tiny int

1 字节

-2^7 (-128) ~ 2^7 - 1 (127)

0 ~255

SMALLINT

small int

2 个字节

-2^15 (-32,768) ~2^15 - 1 (32,767)

0 ~65535

MEDIUMINT

medium int

3 个字节

-8388608~8388607

0~16777215

INT

int

4 个字节

-2^31(-2147483648) ~ 2^31-1(2147483648)

0~4294967295

INTEGER

Integer

4 个字节

BIGINT

big int

8 个字节

-2^63 (-9223372036854775808) ~ 2^63-1 (9223372036854775807)

0~18446744073709551615

FLOAT(X)

float(x)

4 如果 X < = 24 或 8 如果 25 < = X < = 53

-3.4E+38 和 3.4E+38

FLOAT

float

4 个字节

DOUBLE

double

8 个字节

(b)字符类型:

字符类型需要和编码格式:
UTF8编码中一个汉字(包括数字)占用3个字节
GBK编码中一个汉字(包括数字)占用2个字节

列类型

需要的存储量

CHAR(M)

M字节,1 <= M <= 255

VARCHAR(M)

L+1 字节, 在此L <= M和1 <= M <= 255

TINYBLOB, TINYTEXT

L+1 字节, 在此L< 2 ^ 8

BLOB, TEXT

L+2 字节, 在此L< 2 ^ 16

MEDIUMBLOB, MEDIUMTEXT

L+3 字节, 在此L< 2 ^ 24

LONGBLOB, LONGTEXT

L+4 字节, 在此L< 2 ^ 32

ENUM(‘value1’,‘value2’,…)

1 或 2 个字节, 取决于枚举值的数目(最大值65535)

SET(‘value1’,‘value2’,…)

1,2,3,4或8个字节, 取决于集合成员的数量(最多64个成员)

text与blob的区别在于:text不能存储图片。blob是二进制流,text是非二进制。
mysql 的二进制数据类型 BINARY, VARBINARY, BLOB 都没有字符集的概念。

(c)日期类型:

列类型(大写)

列(小写)

需要的存储量

显示格式:

DATE

date

3 个字节

以YYYY-MM-DD的格式显示,比如:2009-07-19

DATETIME

date time

8 个字节

以YYYY-MM-DD的格式显示,比如:2009-07-19,自动存储记录修改时间

TIMESTAMP

time stamp

4 个字节

以YYYY-MM-DD HH:MM:SS的格式显示,比如:2009-07-19 11:22:30

TIME

time

3 个字节

以HH:MM:SS的格式显示。比如:11:22:30

YEAR

year

1 字节

以YYYY的格式显示。比如:2009

2,varchar(100)和char(100)的区别

(1)varchar作为可变长字节,所以varchar比char,多一个字节来管理长度。

需要注意的一个点是,一个直接只能管理255的长度,超过255那么就需要多一个字节

(2)varchar创建临时表的时候,会转为char,长度为设置长度

3,参考文章:

一篇文章看懂mysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别