数据类型对数据库的优化非常重要

优先选择符合需求的最小数据类型

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个字节

  1. CREATE TABLE user {
  2. ip CHAR(15)
  3. }

其实IP地址可以使用一些函数库先转换成整数,存储到数据库里面。取出的时候再把整数转换成对应的IP地址即可。

  1. INET_ATON('255.255.255.255') = 4294967295
  2. INET_NTOA(4294967295) = '255.255.255.255'

转换的时候直接将255.255.255.255转为对应的二进制,把点符号去掉

  1. 0b11111111 11111111 11111111 11111111

也就是无符号的最大值4294967295

  1. CREATE TABLE user {
  2. ip INT UNSIGNED
  3. }

非负数使用UNSIGNED

人的年龄可以使用TINYINT存储(-128 ~ 127 ),但万一有的人年龄超过127岁,我们可以使用TINYINT UNSIGNED存储(0 ~ 255 )。

金钱相关的数据,必须使用DECIMAl类型

比如商品的价格,汇率等

固定长度的字符串尽量使用CHAR类型

典型的手机号、身份证、SHA256等