本人在此声明,本人现阶段只涉猎mysql和sqlserver故只比较这两种
整型
整型分类 | 、难度 |
---|---|
bit | 1bit 要么0要么1 |
TINYINT | 1字节(MySQL可正可负,SQL server 只有正数) |
SMALLINT | 2字节 |
MEDUIMINT | 3字节(注意SQL server无此数据类型) |
INT | 4字节 |
BIGINT | 8字节 |
就如tinyint的取值范围,因为是1字节=8bit位,故有符号数的取值范围是-128~127,无符号数的取值范围是0 ~255.
上面的整型,大家根据字节数可推算相应类型的取值范围。
若不要复数,可在类型后加上unsigned 如 id int unsigned 则在mysql中的取值范围从有符号的-2^15~
2^15-1
int(5) 5代表宽度 即不够7位数则补0 如设置int(5) zerofill 则输入123 显示00123,但是如果超出5位数,依旧可以正常显示,如123456,可以正常显示123456,所以在我看来加zerofill完全是为了显示工整并且如果不加zerofill的话, 设置宽度无效,且 zerofill默认无符号,故有 zerofill则可以不写unsigned
CREATE TABLE testsql1111(id0 int(3), id1 int(3) ZEROFILL,id2 int);
INSERT INTO testsql1111 VALUES(1,1,1)
SELECT * FROM testsql1111;
查看其长度
至于sqlserver
在建表验证过程中出现了以下问题,即SQL SERVER无法指定整型的列宽
小数
(此为mysql)又可分为定点型和浮点型
分类 | 字节数 |
---|---|
浮点型 | 字节数 |
float | 4字节 |
double | 8字节 |
定点型 | 备注 |
decimal(M,D) | decimal默认M,D为10,0 |
dec(M,D)取值范围小但精准,没有误差适合精度高的场景
浮点型 取值范围大但不精准,有误差适合不需要精度高的场景
因精度缺失,不推荐使用浮点型,另外浮点型因精度缺失在进行比较时不使用等号
D:小数点后有D位,少则补0,多的四舍五入
M:整数部位加小数部位为M位,超过范围则插入临
SQLSERVER 和mysql差不多但浮点型是float和real 定点小数是 decimal和numeric(numeric和decimal差不多)
日期型
此为mysql常用的有YEAR DATE TIME DATETIME TIMESTAMP
类型 | 名称 | 字节 | 日期格式 | 最小值 | 最大值 |
---|---|---|---|---|---|
YEAR | 年 | 1 | YWYY或YY | 1901 | 2155 |
TIME | 时间 | 3 | HH:MM:SS | -838:59:59 | 838:59:59 |
DATE | 日期 | 3 | YYYY-MM-DD | 1000-01-01 | 9999-12-03 |
DATETIME | 日期时间 | 8 | YYYY-MM-DD | HH:MM:SS | 1000-01-01 00:00:00 |
TIMESTAMP | 日期时间 | 4 | YYYY-MM-DD | HH:MM:SS | 1970-01-01 00:00:00 UTC |
YEAR:2位字符串的YEAR已经不推荐使用,若写01-69 会自动转为2001-2069,若写70-99,会自动转为1970-1999,若添加整数0或00会转换为0000年,若用或日期类型或字符串会转换为2000年,YYYY超出范围报错。
DATE:和上面类似可写为YY-MM-DD,YY和上面一样 在crud时可写为(‘YYYY-MM-DD’),(YYYYMMDD)(‘YYYYMMDD’)(YYMMDD)(‘YY-MM-DD’)后面这几种会做隐式转换
获取当前DATATIME类型日期mysql可以用CURRENT_DATE()或NOW()或CURRENT(),sqlserver 使用GETDATE()
TIME:即时分秒,(1)可以使用带有冒号的字符串,比如’D HH:MM:SS’、‘HH:MM:SS’、‘HH:MM’、‘D HH:MM’, ‘D HH’ 或 ‘SS’ 格式,都能被正确地插入TIME类型的字段中。其中D表示天,其最小值为0,最大值为34。如果使用带有D格式的字符串插入TIME类型的字段时,D会被转化为小时,计算格式为D*24+HH。当使用带有冒号并且不带D的字符串表示时间时,表示当天的时间,比如12:10表示12:10:00,而不是00:12:10。
(2)可以使用不带有冒号的字符串或者数字,格式为 ‘HHMMSS’ 或者 HHMMSS。如果插入一个不合法的字符串或者数字,MySQL在存储数据时,会将其自动转化为00:00:00进行存储。比如1210,MySQL会将最右边的两位解析成秒,表示00:12:10,而不是12:10:00。
TIMESTAMP与DATETIME
TIMESTAMP占4个字节,范围是1970年1月1日08时00分01秒——2038年的某月某日某时某分某秒某毫秒,和时区有关,更能反应实际日期,更适合跨时区的开发或服务,但表示范围小,受mysql和sqlmodel的影响大
DATETIME占8个字节,只能反应操作时的时区的时间,但表示范围更大,1000年1月1日——9999年12月31日
至于sqlserver的日期类型
数据类型 | 说明 |
---|---|
date | 从 0001-1-1到 9999-12-31 |
time | 时间24小时制 |
smalldatetime | 日期时间 2020-05-06 12:10:20 |
datetime | 范围 1753年1月1日到9999年12月31 |
datetime2 | 支持日期从0001-01-01到9999-01-01 |
datetimeoffset | 同比于TIMESTAMP |
文本类型
char 与varchar
char的取值长度时0~255,其中char的默认值时1即char(1),这个我们可以自己定义如定义char(8)则最多可保存长度为8,
当然我遇到了一个问题,即,第一行的char可以保存长度为9,但不能超过9
varchar的最大长度mysql为65535,sqlserver的为8192,长度可变
如果字符串长度差不多,推荐使用char进行储存
varchar为可变字符串,不事先分配存储空间,最好长度不要超过5000,若超过此值,则独立一张表,改为用text来进行存储,并用主键来对应,避免影响其他字段的索引效率。来自:java开发手册之mysql数据库
至于长文本类型有 TINYTEXT,TEXT,MEDIMUTEXT,LONGTEXT,在出血阶段有、使用不多,故不作详细介绍。
至于sqlserver数据库中用的最多的文本类型,包括任意字母、符号或数字、字符的组合,主要有下面的六种:
(1)char: 固定长度的非Unicode字符数据,最大长度为8000个字符。 char(2)
(2)varchar: 可变长度的非Unicode数据,最大长度为8000个字符。 varchar(20)
(3)text:存储长文本信息,最大长度为231-1(2147483647)个字符。
(4)nchar:固定长度的Unicode数据,最大长度为4000个字符。
(5)nvarchar:可变长度的Unicode数据,最大长度为4000个字符。
(6)ntext:存储可变长度的长文本, 230-1(1073741823)个字符。
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
注意:带n的数据类型长度是不带n的两倍。比如nchar(1)和char(2)长度相同