整型
mysql中tinyint、smallint、mediumint、int、bigint的区别
tinyint
从 -2^7 (-128) 到 2^7 - 1 (127) 的整型数据。存储大小为 1 个字节。
unsigned 是从 0 到 255 的整型数据。
所以建表的时候 不管是tinyint(3),还是tinyint(20),有符号tinyint最大还是127这么多,无符号则最大255。
int(n)要搭配unsigned zerofill才有效,n代表显示宽度,不足用0填充
smallint
从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据。存储大小为 2 个字节。
unsigned 是从 0 到 65535 的整型数据。
mediumint
从 -2^23 (-8,388,608) 到 2^23 - 1 (8,388,607) 的整型数据(所有数字).存储大小为3个字节。
unsigned 是从 0 到 16,777,216 的整型数据。
int
从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字).存储大小为 4 个字节。
unsigned 是从 0 到 4294967296 的整型数据。
bigint
从 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807) 的整型数据(所有数字)。存储大小为 8 个字节。
unsigned 是从 0 到18,446,744,073,709,551,616的整型数据。
注意:
mysql提供了五种整型: tinyint、smallint、mediumint、int和bigint。int为integer的缩写。这些类型在可表示的取值范围上是不同的。 整数列可定义为unsigned从而禁用负值;这使列的取值范围为0以上。各种类型的存储量需求也是不同的。取值范围较大的类型所需的存储量较大。
浮点型
mysql 提供三种浮点类型: float、double和decimal。与整型不同,浮点类型不能是unsigned的,其取值范围也与整型不同,这种不同不仅在于这些类型有最大 值,而且还有最小非零值。最小值提供了相应类型精度的一种度量,这对于记录科学数据来说是非常重要的(当然,也有负的最大和最小值)。
double 和 float 彼此的优缺点:
float单精度
优点: float单精度在一些处理器上比double双精度更快而且只占用double双精度一半的空间
缺点: 但是当值很大或很小的时候,它将变得不精确。
double双精度
优点: double 跟 float比较, 必然是 double 精度高,尾数可以有 16 位,而 float 尾数精度只有 7 位
缺点: double 双精度是消耗内存的,并且是 float 单精度的两倍! ,double 的运算速度比 float 慢得多, 因为double 尾数比float 的尾数多, 所以计算起来必然是有开销的!
decimal
在存储同样范围的值时,通常比decimal使用更少的空间,float使用4个字节存储,double使用8个字节 ,而 decimal依赖于M和D的值,所以decimal使用更少的空间。在实际的企业级开发中,经常遇到需要存储金额(3888.00元)的字段,这时候就需要用到数据类型decimal。
在MySQL数据库中,decimal的使用语法是:decimal(M,D),其中,
M 的范围是165,
D 的范围是030,
而且D不能大于M。
字符型
类型 | 大小 | 用途 |
CHAR | 0-255字符 | 定长字符串,char(n)当插入的字符数不足n时(n代表字符数),插入空格进行补充保存。在进行检索时,尾部的空格会被去掉。 |
VARCHAR | 0-65535 字节 | 变长字符串,varchar(n)中的n代表最大字符数,插入的字符数不足n时不会补充空格 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
char是一种固定长度的类型,无论储存的数据有多少都会固定长度,如果插入的长度小于定义长度,则可以用空格进行填充。而varchar是一种可变长度的类型,当插入的长度小于定义长度时,插入多长就存多长。
char和varchar区别
1、最大长度:char最大长度是255字符,varchar最大长度是65535个字节。
2、定长:char是定长的,不足的部分用隐藏空格填充,varchar是不定长的。
3、空间使用:char会浪费空间,varchar会更加节省空间。
4、查找效率:char查找效率会很高,varchar查找效率会更低。
5、尾部空格:char插入时可省略,vaechar插入时不会省略,查找时省略。
注意char最大长度n是255字符,varchar最大长度是65535个字节,n最大是65535/3=21845字符,这里使用的是utf-8字符集,1个字符=3个字节
oracle中char varchar nvarchar区别
两字段分别有字段值:我和coffee
那么varchar字段占2×2+6=10个字节的存储空间,而nvarchar字段占8×2=16个字节的存储空间。
如字段值只是英文可选择varchar,而字段值存在较多的双字节(中文、韩文等)字符时用nvarchar
类型 | 长度 | 使用说明 | 长度说明 |
char(n) | 定长 | 索引效率高 程序里面使用trim去除多余的空白 | n 必须是一个介于 1 和 8,000 之间的数值,存储大小为 n 个字节 |
varchar(n) | 变长 | 效率没char高 灵活 | n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节 |
text(n) | 变长 | 非Unicode数据 | 不用指定长度 |
nchar(n) | 定长 | 处理unicode数据类型(所有的字符使用两个字节表示) | n 的值必须介于 1 与 4,000 之间。存储大小为 n 字节的两倍 |
nvarchar(n) | 变长 | 处理unicode数据类型(所有的字符使用两个字节表示) | n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零 |
ntext(n) | 变长 | 处理unicode数据类型(所有的字符使用两个字节表示) | 不用指定长度 |
varchar(10)与nvarchar(10)
前者是非unicode型,存储字符按1个算(内部空间存储占1字节),存储汉字的话按2个算,
就是可以存10个字符或者5个汉字
后者是unicode型,存储什么都是按1个算(内部空间存储占2字节),
就是可以存10个字符或10个汉字
varchar(10)与nvarchar(10)就是分别占10个字节和20个字节
日期和时间
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
DATE | 3 | 1000-01-01 到 9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59' 到 '838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901 到 2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00 到 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00 到 2038-01-19 03:14:07 | YYYYMMDDhhmmss | 混合日期和时间值,时间戳 |
- MySQL能存储的最小时间粒度为秒。
- 建议用DATE数据类型来保存日期。MySQL中默认的日期格式是yyyy-mm-dd。
- 用MySQL的内建类型DATE、TIME、DATETIME来存储时间,而不是使用字符串。
- 当数据格式为TIMESTAMP和DATETIME时,可以用CURRENT_TIMESTAMP作为默认(MySQL5.6以后),MySQL会自动返回记录插入的确切时间。
- TIMESTAMP是UTC时间戳,与时区相关。
- DATETIME的存储格式是一个YYYYMMDD HH:MM:SS的整数,与时区无关,你存了什么,读出来就是什么。
- 除非有特殊需求,一般的公司建议使用TIMESTAMP,它比DATETIME更节约空间,但是像阿里这样的公司一般会用DATETIME,因为不用考虑TIMESTAMP将来的时间上限问题。
- 有时人们把Unix的时间戳保存为整数值,但是这通常没有任何好处,这种格式处理起来不太方便,我们并不推荐它。