数据类型对数据库的优化非常重要
优先选择符合需求的最小数据类型
MYSQL中大致可以分为3种类型的数据:数值、日期和字符串类型
数值类型
程序读取数据库里面的字段需要映射到对应的Java类型,而java中是没有无符号数据概念的,默认都是有符号的。比如Integer 或者 int 类型既可以存储负数也可以存储正数。无符号数据只能存储正数或者0.这个是Java语言细节的地方。
MYSQL类型 | 字节 | 有符合数取值范围 | 无符号取值,字段后面加unsigned |
---|---|---|---|
TINYINT | 1 | -128 ~ 127 (转成Java的Byte) | 0 ~ 255 (转成Java的Short) |
SMALLINT | 2 | -32768 ~ 32767(转成Java的Short) | 0 ~ 65535 (转成Java的Integer) |
MEDIUMINT | 3 | -8 388 608 ~ 8 388 607 (转成Java的Integer) | 0 ~ 16 777 215 (转成Java的Integer) |
INT或INTEGER | 4 | -2 147 483 648 ~ 2 147 483 647 (转成Java的Integer) | 0 ~ 4 294 967 295(转成Java的Long) |
BIGINT | 8 | -9,223,372,036,854 ~ 775,808,9 223 372 036 854 775 807 (转成Java的Long) | 0 ~ 18 446 744 073 709 551 615 (转成Java的BigInteger) |
日期类型
类型 | 字节 | 范围 | 格式 |
---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS |
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 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 |
YYYYMMDD HHMMSS |
YEAR | 1 | 1901/2155 | YYYY |
字符串类型
类型 | 字节 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
典型场景
经纬度
纬度的范围是-90至+90(度),因此可以使用DECIMAL(10,8),但是经度的范围是-180至+180(度,最多为3位数字),因此需要DECIMAL(11,8)。第一个数字是存储的总位数,第二个数字是小数点后的数字。
简而言之: lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL
IP地址
IP地址(如255.255.255.255)直接使用字符串类型存储的话,暂用15个字节
CREATE TABLE user {
ip CHAR(15)
}
其实IP地址可以使用一些函数库先转换成整数,存储到数据库里面。取出的时候再把整数转换成对应的IP地址即可。
INET_ATON('255.255.255.255') = 4294967295
INET_NTOA(4294967295) = '255.255.255.255'
转换的时候直接将255.255.255.255转为对应的二进制,把点符号去掉
0b11111111 11111111 11111111 11111111
也就是无符号的最大值4294967295
CREATE TABLE user {
ip INT UNSIGNED
}
非负数使用UNSIGNED
人的年龄可以使用TINYINT存储(-128 ~ 127 ),但万一有的人年龄超过127岁,我们可以使用TINYINT UNSIGNED存储(0 ~ 255 )。
金钱相关的数据,必须使用DECIMAl类型
比如商品的价格,汇率等
固定长度的字符串尽量使用CHAR类型
典型的手机号、身份证、SHA256等