Mysql数据类型
数值
数据类型 | 字节数 | 含义 | 数据范围 |
tinyint | 1 | 非常小的整数 | 有符号的范围是-128到127,无符号的范围是0到255 |
smallint | 2 | 小整数 | 有符号的范围是-32768到32767,无符号的范围是0到65535 |
mediumint | 3 | 中等大小的int | 有符号的范围是-8388608到8388607,无符号是0到16777215 |
int | 4 | 标准的整数 | 有符号的范围是-2147483648到2147483647,无符号是0到4294967295 |
bigint | 8 | 大整数 | 有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615 |
decimal | 定点数 | 一个未压缩(unpack)的浮点数字。DECIMAL(M,d)M字节.不能无符号。行为如同一个CHAR列:“未压缩”意味着数字作为一个字符串被存储,值的每一位使用一个字符,每9位数字需要4个字节。剩下的数字需要1到4个字节 | |
float | 4 | 单精度浮点数 | 不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38,0 和 1.175494351E-38到3.402823466E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有<24 的一个 参数表示一个单精密浮点数字 |
double | 8 | 双精度浮点数 | 允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308 |
bit | M | 位字段 | 可变取决于M,一个bit值大约为(M+7)/8个字节的存储空间 |
字符串值
mysql 的二进制数据类型 BINARY, VARBINARY, BLOB 都没有字符集的概念。
数据类型 | 含义 |
char | 固定长度的非二进制字符串M的范围是 1——255 个字符 |
varchar | 可变长度的非二进制字符串,M的范围是 1——65532 个字符 |
binary | 固定长度的二进制字符串 |
varbinary | 可变长度的二进制字符串 |
tinyblob | 非常小的blob |
blob | blob 最大长度为65535(2^16-1)个字符,二进制流 |
mediumblob | 中等大小的blob |
longblob | 大blob,一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符 |
tinytext | 非常小的非二进制字符串 |
text | 小文本,最大长度为65535(2^16-1)个字符。 不能存储图片,非二进制。 |
mediumtext | 中等大小的非二进制字符串,一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符 |
longtext | 大的非二进制字符串,一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符 |
enum | 枚举集合,这个值式选自与值列表’value1’、‘value2’, …,或NULL。一个ENUM最多能有65535不同的值 |
set | 集合,能有零个或多个值的一个字符串对象,其中每一个必须从值列表’value1’, ‘value2’, …选出。一个SET最多能有64个成员 |
日期时间值
日期时间数据类型。
数据类型 | 含义 | 取值范围 | 字节 |
date | 日期值,格式YYYY-MM-DD | ’1000-01-01‘到’9999-12-31‘ | 3 |
time | 时间值,格式’hh:mm:ss‘ | ’-838:59:59‘到’838:59:59‘ | 3 |
datetime | 日期加时间值。YYYY-MM-DD hh:mm:ss | ’1000-01-01 00:00:00‘到’9999-12-31 23:59:59‘ | 8 |
timestamp | utc时间戳值,YYYY-MM-DD hh:mm:ss | ’1970-01-01 00:00:01‘到’2038-01-19 03:14:07‘ | 4 |
year | 年份 ccYY或YY | year(4):1901到2155 year(2):1970到2069 | 1 |
坐标值
set @pt=pointfromatext(‘point(10,20)’);
空间数据类型
数据类型 | 含义 | |
geometry | 任何类型的坐标值 | |
point | 点(一对 x,y坐标值) | |
linestring | 曲线(一个或多个point) | |
polygon | 多边形 | |
geometrycollection | geometry值的集合 | |
multllinesting | linestring值的集合 | |
multipoint | point值的集合 | |
multipolygon | polygon的值集合 |
布尔值
在boolean值中,零表示“假”,任何非零,非null的值都为“真” 1true,0false
空值NuLL
NULL是一个“没有类型”的值,他通常用来表示“没有数据”,“数据未知”,“数据缺失”,“数据不支持”
如何进行挑选数值数据类型
在选择数据类型时需要考虑并挑选一个能够覆盖该范围的最小类型使用,选择较大的类型会浪费存储空间,毫无必要的是数据表变大,会降低数据的处理效率。所以要选择合适的数据类型对数据表数据。
应该把值表示为字符数据还是二进制数据?
如果字符数据选择非二进制字符串类型最合适;如果是二进制数据就选择一种二进制字符串类型。
比较操作需要区分字母的大小写情况吗?
如果是,则应该选用一种非二进制字符串类型。让存储在数据库里的字符与一种字符集和排序方式关联起来。
非二进制字符串比较和排序操作中的大小写区分情况取决于指定的排序方式。
你想尽量少占用存储空间吗?
如果是,选用一种可变长度的类型。
数据列的可取值总是某几个合法值之一或他们的组合吗?
如果是,enum或set类型往往是最好的选择,如果字符串是一个有限的集合并且你想按照某种非字母表顺序对他们进行排序,enum类型可以使用
尾缀的空格(或零值字节)很重要吗?
如果数据必须原样存入数据库,原样取出数据库在存储和检索过程中不增加和消除任何尾缀的空格应选用text或varchar数据列。为二进制字符串选用一个blob或varbinary数据列。
数据类型 | 存储时 | 检索时 | 结果 |
char | 补足 | 去掉尾缀 | 检索出来的值没有尾缀 |
binary | 补足 | 无任何动作 | 检索出来的值没有尾缀 |
varchar,varbinary | 无任何动作 | 无任何动作 | 尾缀没有任何变化 |
text,blob | 无任何动作 | 无任何动作 | 尾缀没有任何变化 |
char和varchar数据类型
char和varchar字符串类型用来保存非二进制字符串,因而与这一种字符集和排序方式相关联。
- char是一种固定长度的类型,而varchar是一种长度可变类型
- 从char数据类型检索出来的值的尾缀空格将被去掉。给定一个char(M)的数据列,如果某个值的长度小于M个字符,Mysql在吧存入该数据列时将空格把他补足到M个字符长度,但是在检索时追加的空格在检索时将被去掉。
- 对于vatchar(M)数据列,尾缀空格在存储和检索时都会被保留。
- char类型中的M是可选的,如果省略 他的默认是1,char(0)是合法的,如果你允许他为null值或空字符串。在数据表里 char(0) 数据列置占用非常少的空间----只占用一位。
对varchar(M)数据列而言,M在语义上的取值范围是1到65535,但他实践能够容纳的最大字符个数肯定小于65535,个字节
- 一个长varchar数据列需要2个字节存放字符串值的长度,这两个字节计算在数据行总长度之内。
- 如果使用多字节字符,数据行最大长度所容纳的字符个数将减少。
- 数据表里往往还有其他的数据列,而那些数据列将挤占varchar数据列的“生存”空间,
binary和varbinary数据类型
char和varchar是非二进制类型。Mysql将根据相关的字符集和排序方式把char和varchar数据列的值解释为一系列字符。比较操作的依据是各字符的先后顺序。
binary和varbinary是二进制类型,binary和varbinary数据列里的值是一串字节,不涉及任何字符集和排序方式。比较的是数据各自节的数值大小。
blob和text数据类型
blob类型是由tinyblob,blob,mediumblob,longblob等组成的大家庭。blob数据列存储的是二进制字符串,如果想保存的信息有可能集聚膨胀到非常大的地步,或者个数据行的长短差异很大。存放:压缩数据,加密数据,图像,声音。当blob和text值太大时,innodb会使用专门的“外部”存储区域来进行存储,此时每个值在行内需要1-4个自己存储一个指针,然后在外部存储实际的值。
text类型是由tinytext,text,mediumtext和longtext等类型组成的text家族。text类型存储的是非二进制字符串,
blob和text数据列的值在长度方面往往差异巨大,blob和text数据行的删除和修改容易产生大量碎片
max_sort_length系统变量的设置情况会影响到blob和text值的比较和排序操作,每个blob或text值只有前max_sort_length个字节参加比较或排序,max_sort_length默认值1024不够大而导致的问题就应该加大这个值,如果不行加大max_allowed_packet参数的值
enum和set数据类型
enum和set是比较特殊的字符串数据类型,他们的取值只能预先定义好的字符串。enum数据列里必须包含且只包含一个来自他值列表的成员,而set数据列里只允许包含任意多个来自成员的值。enum类型的值不允许同时出现,而set类型的值允许同时出现。
employees enum(‘less than 100’,‘100-400’,‘501-1550’)
set值被存储为位值,每个字节对应8个set成员。set数据列占用的存储空间取决于他的成员个数,最多为64个。