场景介绍:
- 我们在设计数据库时候,总是不可避免的使用的varchar来作为表的字段,但是表长度应该多少呢?
- 我们很多时候使用varchar来做字段,为什么不用char?
- 每个字段类型可以表示的数据是多少?
- 设置多长字段符合业务需求?
在网上找到了,一些文章,所以写下自己的一些日记。
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)的区别