[技术干货]
MySQL和SQLServer数据类型对比
由于MySQL与Server在数据类型上有部分差异,比如数值类型表示的数值的范围和精度,日期类型的格式和精度等,在我们转换数据库或是在迁移数据库时,会遇上一定的麻烦,下面介绍了一些MySQL与SQLServer数据库数据类型的对应关系。以下所涉及的所有字段类型,在华为云数据管理服务(DAS)均已支持,DAS旨在为用户提供便捷、高效的数据库管理操作入口,欢迎体验使用DAS服务~ | |||||
MySQL | SQL Server | 说明 | |||
类型 | 存储空间(字节) | 类型 | 存储空间(字节) | ||
位值类型 | BIT (1~64) |
(M+7)/8 M为指定的长度 |
BIT | 可被压缩 | MySQL的BIT可以指定长度(1到64),一般使用b'101010'类似的二进制序列为其赋值; SQLServer的BIT不可指定长度,可以取值为1、0或NULL,且如果表中的BIT列为8列或更少,则这些列作为1个字节存储。如果BIT列为9到16列,则这些列作为2个字节存储,以此类推,SQLServer的BIT对应于MySQL的TINYINT(1)。 |
整数类型 | TINYINT [-128~127] |
1 | TINYINT [0-255] |
1 | 注意:MySQL和SQLServer的TINYINT表示的范围并不相同; MySQL和SQLServer的数值类型(包括下方的浮点数类型)都可以在声明时指定显示的长度,如INT(10),当实际存储的数值为7时,则会显示为0000000007。 |
SMALLINT [-2^15~2^15-1] |
2 | SMALLINT [-2^15~2^15-1] |
2 | ||
MEDIUMINT [-2^23~2^23-1] |
3 | 不支持 | |||
INT [-2^31~ 2^31-1] |
4 | INT [-2^31~ 2^31-1] |
4 | ||
BIGINT [-2^63~2^63-1] |
8 | BIGINT [-2^63~2^63-1] |
8 | ||
INTEGER | 4 | 不支持 | 相当于INT | ||
SERIAL | 8 | 不支持 | 相当于BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE | ||
BOOL | 1 | 不支持 | 相当于TINYINT(1) | ||
BOOLEAN | 1 | 不支持 | |||
货币值数据类型 | 不支持 | SMALLMONEY | 4 | SQLServer的货币值数据类型,精度为所代表的货币单位的万分之一,在MySQL中SMALLMONEY可以用decimal(10,4)替代,MONEY可以用默认转换为decimal(19,4)替代。 | |
不支持 | MONEY | 8 | |||
浮点数类型 | FLOAT | 4或8 | FLOAT | 4或8 | MySQL和SQLServer的浮点数存储的都是近似值,高精度的计算可能会有误差。如果需要较高的精度,推荐使用DECIMAL类型。 MySQL的FLOAT(M,D)和FLOAT(p)是不同的,前者表示一个单精度浮点数,精度为7位小数,M和D都是显示的位数,M是总位数,D是小数点后面的位数; 后者与SQLServer的FLOAT相同,都可指定尾数的位数p,如果0<=p<=24则为4个字节,如果25<=p<=53则为8个字节 |
REAL | 8 | REAL | 4 | MySQL:DOUBLE的同义词,如果sql_mode启动了REAL_AS_FLOAT模式,则是FLOAT的同义词而不是 DOUBLE。 SQLServer:相当于FLOAT(24) |
|
DOUBLE | 8 | 不支持 | MySQL:双精度浮点数,精确到15位小数。 | ||
DOUBLE PRECISION | 8 | DOUBLE PRECISION | MySQL:相当于DOUBLE; SQLServer:相当于FLOAT(53)。 |
||
定点数类型 | DECIMAL (1~65[,1~30]) |
可变 | DECIMAL (1~38[,1~38]) |
可变 | 固定精度和小数位数的数值数据类型。 对于精度比较高的东西,比如货币数字,可以采用DECIMAL类型,FLOAT和BOUBLE容易产生误差。存储所需要的空间都与采用的精度有关系。 |
NUMERIC | 可变 | NUMERIC | 可变 | 等同于DECIMAL | |
DEC | 可变 | DEC | 可变 | ||
FIXED | 可变 | 不支持 | |||
日期类型 | DATE [1000-01-01~9999-12-31] |
3 | DATE [0001-01-01~9999-12-31] |
3 | 显示的格式都为YYYY-MM-DD |
DATETIME [1000-01-01 00:00:00.000000~9999-12-31 23:59:59.999999] |
5+小数秒存储 | DATETIME [1753-01-01 00:00:00.000~9999-12-31 23:59:59.997] |
8 | 显示的格式都为YYYY-MM-DD hh:mm:ss[.fraction] MySQL的精度为0.000001,SQLServer的精度会舍入到 .000、.003 或 .007 秒三个增量。 |
|
TIMESTAMP [1970-01-01 00:00:01.000000~2038-01-19 03:14:07.999999] |
4+小数秒存储 | TIMESTAMP | 8 | MySQL和SQLServer的TIMESTAMP如果未明确赋值,则会自动设置为最近修改的日期和时间。 | |
TIME [-838:59:59.000000 ~838:59:59.000000] |
3+小数秒存储 | TIME [00:00:00.0000000~23:59:59.9999999] |
5 | 显示的格式hh:mm:ss[.fraction] 注意:MySQL和SQLServer的精确度不同,MySQL是6位,SQLServer是7位。 |
|
YEAR [1901~2155]和0000 |
1 | 不支持 | MySQL:显示的格式YYYY | ||
不支持 | SMALLDATETIME [1900-01-01 00:00:00~2079-06-06 23:59:59] |
4 | SQLServer:显示格式YYYY-MM-DD hh:mm:ss,精确度为1分钟 | ||
不支持 | DATETIME2 [0001-01-01 00:00:00.0000000~9999.12.31 23:59:59.9999999] |
可变 | SQLServer:显示的格式YYYY-MM-DD hh:mm:ss[.fraction] 精度为7位数,精度小于3时为6个字节;精度为3和4时为7个字节。所有其他精度则需要8个字节。 |
||
不支持 | DATETIMEOFFSET [0001-01-01 00:00:00.0000000~9999.12.31 23:59:59.9999999] |
10 | SQLServer:带有时区偏移量的时间格式,显示的格式为YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+|-}hh:mm] 时区偏移量-14:00到+14:00 |
||
字符串类型 | CHAR (1~255) |
可变 | CHAR (1~8000)或MAX |
n (n为定义的字符串长度,以字节为单位) | 注意:MySQL和SQLServer所采用的单位是不同的,MySQL是以字符为单位,所需要的存储空间为M*w个字节,w为字符集中最大长度的字符所需的字节数。 SQLServer是以字节为单位的,对于单字节编码字符集(如拉丁文),存储大小为n个字节,并且可存储的字符数也为n,对于多字节编码字符集,存储大小仍为n个字节,但可存储的字符数可能小于n。 |
VARCHAR (1~65535) |
L+1 (L表示给定字符串值的实际长度) |
VARCHAR (1~8000)或MAX |
n+2 | 可变长度的字符串数据 | |
TINYTEXT (1~255) |
L+1 | 不支持 | MySQL的TEXT类似于SQLServerVARCHAR类型,在声明时指定的是存储用的字节数,实际存储的字符数和字符集有关。 SQLServer将在未来版本中删除TEXT数据类型,不建议使用。 |
||
TEXT (1~65535) |
L+2 | TEXT | |||
MEDIUMTEXT (1~2^24-1) |
L+3 | 不支持 | |||
LONGTEXT (1~2^32-1) |
L+4 | 不支持 | |||
不支持 | NVARCHAR (1~4000)或MAX |
存储的是Unicode数据类型的字符,所有的字符都用两个字节表示。 | |||
不支持 | NCHAR (1~4000) |
||||
不支持 | NTEXT | SQLServer将在未来版本中删除NTEXT数据类型,不建议使用。 | |||
字节串类型 | BINARY (1~255) |
M (M为指定的字节长度) |
BINARY (1~8000) |
n | 类似于VARCHAR,但是保存的是二进制数据而非字符。 |
VARBINARY (1~65535) |
L+1 | VARBINARY (1~8000)或MAX |
n+2 | ||
TINYBLOB | L+1 | 不支持 | 类似于VARBINARY,但是保存的是二进制数据而非字符。 | ||
BLOB | L+2 | 不支持 | |||
MEDIUMBLOB | L+3 | 不支持 | |||
LONGBLOB | L+4 | 不支持 | |||
不支持 | IMAGE | SQLServer将在未来版本中删除IMAGE数据类型,不建议使用。 | |||
ENUM类型 | ENUM | 可变 | 不支持 | 单选字符串类型,适合存储表单界面中的单选值,格式为:enum('选项1','选项2','选项3',...),enum的enum的选项都会对应一个数字,依次是1,2,3,4,5...,最多有65535个选项,使用的时候可以使用选项的字符串格式,也可以使用对应的数字。 | |
SET类型 | SET | 可变 | 不支持 | 多选字符串类型,适合存储表单界面的多选值。 | |
以上为MySQL和SQLServer的常用数据类型的使用方法对比。DAS服务提供友好的UI操作界面,可以让您方便、高效的管理数据库,敬请期待~ |