数据库(My SQL 、SQL Server)的数据类型
- 数字类型
- 整形
- 浮点/定点型
- 日期和时间类型
- 字符类型
- 字符集与编码
- CHAR和VARCHAR
- BINARY和VARBINARY
- BLOB和TEXT
- ENUM和SET类型
- 选择合适的数据类型
- 参考资料
数字类型
整形
在整数类型中,按照取值范围和存储方式不同,分为tinyint、smallint、mediumint、int和bigint这 5个类型。
- MySQL可以为整形指定宽度,例如int(5)表示当数值宽度小于5位的时候在数字前面填满宽度(数字1 显示为00001),而且要配合ZEROFILL属性使用,否则是没有意义的。
- 其实对大多数应用是没有意义的,它不会限制合法的范围,只规定了MySql的交互工具(如命令行客户端)用来显示字符的个数,存储和计算来说INT(20)与INT(1)是一样的。
- SERIAL is an alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
浮点/定点型
单精度的FLOAT类型及双精度的DOUBLE类型型都是非精确的类型,经过一些操作后并不能保证运算的正确性。
定点数DECIMAL在MySQL内部以字符串形式存放(每4个字节存9个数字,最多65个数字),比浮点数更精确,适合用来表示货币等精度高的数据,也可以使用DECIMAL存储比BIGINT还大的整数。
定点数可以用类型名称后加“(M,D)”的方式来进行表示,“(M,D)”表示该值一共显示M位数字(整数位+小数位),其中D位位于小数点后面;DECIMAL相比浮点数会占用更多的空间,DECIMAL(18,9)小数点前有9位数字(4字节),小数点后有9位数字(4字节),加上小数点本身一共需要占用9个字节)。
日期和时间类型
MySQL数据库中有五种与日期和时间有关的数据类型:
类型 |
占用空间 |
最小值 |
最大值 |
DATETIME |
8字节 |
1000-01-01 00:00:00 |
9999-12-31 23:59:59 |
DATE |
4字节 |
1000-01-01 |
9999-12-31 |
TIME |
3字节 |
-838:59:59 |
838:59:59 |
YEAR |
1字节 |
1901 |
2055 |
TIMESTAMP |
4字节 |
- TIMESTAMP和DATETIME显示的结果是一样的,都是固定的“YYYY-MM-DD HH:MM:SS”的形式。
- TIMESTAMP占用4字节,显示的范围为“1970-01-01 00:00:00”UTC到“2038-01-19 03:14:07”UTC。其实际存储的内容为“1970-01-01 00:00:00”到当前时间的毫秒数。TIMESTMAP保存的是时间戳,所以是和时区有关的。
- FROM_UNIXTIME()函数把Unix时间戳转换为日期,UNIX_TIMESTAMP()函数把 日期转换为Unix时间戳。
- 列为TIMESTAMP的日期类型可以设置一个默认值并且在记录更新时设置TIMESTAMP自动更新为当前时间(DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP),表中的第一个 TIMESTAMP类型默认会拥有此属性。
字符类型
字符集与编码
常见字符集包括:ASCII字符集、LATIN1字符集、GB2312字符集、GBK字符集、GB18030字符集、Unicode字符集等。
ASCII是基于罗马字母表的一套字符集,它采用1个字节的低7位表示字符,高位始终为0。LATIN1字符集相对于ASCII字符集做了扩展,仍然使用一个字节表示字符,但启用了高位,扩展了字符集的表示范围。GB2312、GBK、GB18030字符集是支持中文的字符集,字符集范围GB2312<gbk< gb18030。<="" p="" style="box-sizing: border-box; font-size: 18px; line-height: 30px; overflow-wrap: break-word;"></gbk<>
Unicode字符集是计算机科学领域里的一项业界标准,支持了所有国家的文字字符。Unicode字符集有好几种编码方式,比如常见的utf-8,utf-16,utf-32等。Utf8采用1-4个字节表示字符,utf-16采用固定的2个字节,utf-32则采用4个字节存储。
- 建库时,若未明确指定字符集,则采用character_set_server(mysql.ini文件中的mysqld.character_set_server字段)指定的字符集。
- 建表时,若未明确指定字符集,则采用当前库所采用的字符集。
- 新增、修改表字段时,若未明确指定字符集,则采用当前表所采用的字符集。
排序规则(Collation)是指对指定字符集下不同字符的比较规则。
utf8字符集默认的排序规则是utf8_general_ci(_ci结尾表示大小写不敏感),此时’a’ 与 ‘A’是一样的。
mysql> SET NAMES CHARACTER_SET utf8 COLLATE utf8_bin;
将排序规则指定为utf8_bin,则表示希望区分大小写字符。
CHAR和VARCHAR
CHAR和VARCHAR是最常使用的两种字符串类型。一般来说,CHAR(N)用来保存固定长度的字符串,VARCHAR(N)用来保存变长字符类型。对于CHAR类型,N的范围为0~255,对于VARCHAR类型,N的范围为0~65 535。CHAR(N)和VARCHAR(N)中的N都代表字符长度,而非字节长度。
- LENGTH函数返回的是字节长度,而不是字符长度。
- 对于CHAR类型采用Unicode编码字符集的字段,数据库会保存最大可能的字节数。例如,对于CHAR(30),数据库可能存储90字节的数据。
- CHAR和VARCHAR都会保留字符串最前面的空格,是VARCHAR可以保留字符串最后面的空格,CHAR类型不会保留字符串最后面的空格。但是当做字符串匹配时都会去掉首尾的空格。
- 使用VARCHAR(5)和VARCHAR(200)存储’hello’的空间开销虽然是一样的,但是MySQL通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序或操作时会特别糟糕。在利用磁盘临时表进行排序时也同样糟糕。所以最好的策略是只分配真正需要的空间。
CHAR VS VARHAR - 国内程序员设计数据库时默认都是utf-8字符集,对于utf-8字符集而言 char(10)会占用30个字节,比varchar浪费空间。
- CHAR类型只有在表中所有字段都是固定长度的情况下会比使用VARCHAR速度上有优势,如果你的表中有其它字段为VARCHAR类型,那么都用VARCHAR吧。
- 如果使用的是INNODB存储引擎,推荐使用VARCHAR。
BINARY和VARBINARY
BINARY(N)和VARBINARY(N)存储的是二进制的字节流,N指的是字节长度,而非字符长度。
BLOB和TEXT
BLOB可以视为足够大的VARBINARY类型。
TEXT可以视为足够大的VARCHAR类型。
- 在BLOB和TEXT类型的列上创建索引时,必须制定索引前缀的长度。而VARCHAR和VARBINARY的前缀长度是可选的。
- BLOB和TEXT类型的列不能有默认值。
- 在排序时只使用列的前max_sort_length个字节。
因为Memory引擎不支持BLOB和TEXT类型,如果查询使用了BLOB或TEXT列并且需要使用隐式临时表,将不得不使用MyISAM磁盘临时表,这会导致严重的性能开销。尽量避免使用BLOB和TEXT类型,不要对BLOB、TEXT类型字段做
排序。
ENUM和SET类型
ENUM中文名称叫枚举类型,它的值范围需要是创建表时显示指定的字符串集合,枚举类型值在实际存储时会转换为集合中得下标(数字型,从1开始),所以可以节省大量的空间。
create table t (gender enum(‘MALE’,’FEMAIL’));
Value |
Index |
备注 |
NULL |
NULL |
ENUM类型可以为NULL |
” |
0 |
不在指定的枚举列表中得错误值 |
‘MALE’ |
1 |
从1开始 |
‘FEMALE’ |
2 |
当插入不在 ENUM 指定范围内的错误值时,mysql会保存下标0,查询出的结果会转换为空字符串。
但是当SQL_MODE设置为strict_trans_tables时,如果插入一个不存在集合中的值会报错。
* If you store a number into an ENUM column, the number is treated as the index into the possible values, and the value stored is the enumeration member with that index.*
INSERT INTO t (gender) VALUES(1),(‘1’),(‘MALE’);
//插入三条gender值为’MALE’的数据
ENUM优势与劣势
优势:数据紧凑,存储的是整数,占用空间小,作为关联字段时,效率比varchar类型高很多;
劣势: ENUM类型不容易扩展,字符串列表是固定的,添加或者删除字符串必须使用ALTER TABLE,如果添加的字符串不在列表末尾,则需要重建整个表完成修改。存储数字类型的字符串更是难以理解,ENUM是Mysql独有的类型不容易做数据迁移。建议谨慎使用ENUM。
SET和ENUM类似都是需要在创建表时指定一个范围集合,最主要的区别在于 SET 类型一次可以选取多个成员,而ENUM则只能选一个。
选择合适的数据类型
选择正确的数据类型对于获得高性能至关重要,数据类型选择可以有以下原则:
- 更小的通常更好:因为它们占用更少的磁盘,内存,CPU缓存,处理时需要的 CPU周期也少。
- 简单就好:简单的数据类型通常需要更少的CPU处理周期,比如整型比字符串类型操作代价更低,因为字符集和校对规则使字符比较比整理更复杂,比如:通常可以使用内建日期来代替字符串存储日期,整型来存储IP地址;
- 尽量避免NULL: Null对于mysql来说更难优化,如果要列要加索引,尽量设置Not NULL;
数据库(My SQL 、SQL Server)的数据类型相关推荐
- Sql Server之数据类型详解
数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型.数值类型以及日期类型等.数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为 ...
- sql查看数据库线程数_SQL Server始终在可用性组数据库上的最大辅助线程
sql查看数据库线程数 This article gives an overview of the Max Worker Threads for the SQL Server Always On Av ...
- 学习sql注入:猜测数据库_学习SQL:SQL数据类型
学习sql注入:猜测数据库 What are SQL data types, why do we need them, and how to use them? Today, we'll try to ...
- Java数据库基础--以SQL Server为例
sql server数据库基本概念 使用文件保存数据存在几个缺点: 1.文件的安全性问题: 2.文件不利于查询和对数据的管理: 3.文件不利于存放海量数据 4.文件在程序中控制不方便. 数据库的定义( ...
- 【数据库原理与SQL Server应用】Part03——T-SQL语言
[数据库原理与应用]Part03--T-SQL语言 一.SQL语言基本概念 1.1 T-SQL语言简介 T-SQL语言的特点: 核心SQL语言的4个部分: 1.2 T-SQL语言的语法约定 1.3 标 ...
- SQL Server常见数据类型介绍
数据表是由多个列组成,创建表时必须明确每个列的数据类型,以下列举SQL Server常见数据类型的使用规则,方便查阅 Character 字符串: 数据类型 描述 存储 char(n) 固定长度的字符 ...
- 8月数据库排行榜:SQL Server分数下降最多
作者 | 局长 来源 | OSC开源社区(ID:oschina2013) DB-Engines 8 月份流行度排行已更新(基于 7 月份的整体数据变化). 分数波动较大的数据库是 Microsoft ...
- SQL Server 2000数据库移植到SQL Server 2008R2数据库服务器中碰到的”3145错误”及解决办法...
辛苦忙碌了一个星期终于安装配置好了TFS服务器,给每个团队成员分配了账户和邮箱.不过,老机器中的部分数据需要备份到新机器中,其中在移植一个使用DVBBS架设的论坛的时候,出了点问题,记录如下,以备查找 ...
- Oracle 数据库、Microsoft SQL Server、MySQL 数据库三种常见数据库的区别深度剖析
文章目录 前言 一.ORACLE 数据库 二.Microsoft SQL Server 数据库 三.MySQL 数据库 总结 前言 Oracle 数据库.Microsoft SQL Server.My ...
- 利用Navicat Premium将SQL Server数据库转为My SQL数据库(解决Mac无法打开SQL Server 脚本文件的方法)
利用Navicat Premium将SQL Server数据库转为My SQL数据库(解决Mac无法打开SQL Server 脚本文件的方法) 安装好Navicat Premium,SQL Serve ...
最新文章
- Git -- 基本操作 之 版本回退
- BCH的压力测试其实已经开始了
- 5.Python基础语法(函数/条件控制/循环语句/可迭代对象/迭代器/生成器/对象赋值/浅复制/深复制)
- 隐马尔可夫模型:HMM
- windows 10 内置bash 安装32位支持
- android字符串块,Android字符串进阶之一(特殊字符的输入)
- 2万人同时访问 nodejs_面向前端工程师的Nodejs入门手册(一)
- Android—Binder+AIDL
- 【渝粤题库】国家开放大学2021春2717家畜解剖基础题目
- 单点登陆(SSO)组件的设计与实现一 【转】
- USB学习笔记--USB枚举过程
- socket用起始码分割_编码器基础——格雷码的编码美学
- 【飘儿菜】-Matplotlib-绘制饼图
- ps最大兼容 计算机一级,Photoshop最大兼容是什么意思?最大兼容使用解析
- markdown的各种操作
- Troubleshooting: High Version Count Issues (文档 ID 296377.1)
- 论随机数AC大法(1)
- ameya30代理品牌尼得科电风扇专用无刷直流马达和扇叶模组
- 变频器LED显示灯闪烁_东莞变频器常见故障维修华中伺服驱动器维修
- 灰色关联分析模型(C++代码)