一般情况下,设计表时,考虑到数据能存就可以了,往往在数据类型的细微选择上有所忽略
其实,一个字段的数据类型,对表数据存储所占的空间、索引的组织及其所占的空间,从而由此引起的硬盘IO的数量大小都是有关系的。
所以,请大家谈谈对各种数据类型的认识、相互比较及用法经验...等方面。
其实,一个字段的数据类型,对表数据存储所占的空间、索引的组织及其所占的空间,从而由此引起的硬盘IO的数量大小都是有关系的。
所以,请大家谈谈对各种数据类型的认识、相互比较及用法经验...等方面。
int 默认是0 Integer默认是null 这个问题很棘手?大侠们有什么意见?
简单的说:
char 是固定宽度的,所以 'A' , 'ABCDED' 占用的宽度都是一样。会有存储空间上的浪费, 但如果表中的记录是固定宽度,显示速度上会提高很多。varchar 与 char 相反,是变长的,优缺点也与char 相反。text 是一种 blob 的存储。 一般不做为索引字段。仅保存。
INTEGER 本身在MYSQL中就是INT的同义词。INTEGER[(M)] [UNSIGNED] [ZEROFILL]
This type is a synonym for INT.
没有你所说的这种问题。测试如下。
mysql> create table tt (k int,id int,ic integer);
Query OK, 0 rows affected (0.08 sec)mysql> insert into tt(k) values (1);
Query OK, 1 row affected (0.09 sec)mysql> select * from tt;
+------+------+------+
| k | id | ic |
+------+------+------+
| 1 | NULL | NULL |
+------+------+------+
1 row in set (0.00 sec)mysql>
固定长度字符串,当保存时在右侧填充空格以达到指定的长度。M表示列长度。M的范围是0到255个字符。
如果想要将某个CHAR的长度设为大于255,执行的CREATE TABLE或ALTER TABLE语句将失败并提示错误。
VARCHAR(M)
变长字符串。M 表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定。最大有效长度是65,532字节)。
VARCHAR保存时用一个字节或两个字节长的前缀+数据。如果VARCHAR列声明的长度大于255,长度前缀是两个字节。TEXT[(M)]
最大长度为65,535(216–1)字符的TEXT列。
可以给出可选长度M。则MySQL将列创建为最小的但足以容纳M字符长的值的TEXT类型。
INT 4 bytes -2147483648 to 2147483647 OR 0 to 4294967295
CHAR(10) 10 bytes -999999999 to 9999999999
VARCHAR(10) 11 bytes -999999999 to 9999999999存储上的效率如上。
其它方面的效率要看情况。如果操作多为 fld like %123%', concat (fld ,'AAA') 这种字符串操作,则char/varchar 为好。 如多为数据计算则 INT 较好
内因是这样吧:
从存储上int所耗的空间要少,所以,也意味着在同等记录数下(当然只考虑除了这个字段外其他字段均相同啦),则查找相同记录数时,同等查询条件和索引时,INT所要扫描的数据页数量要少。
同时,该列为索引时,int所占的索引页也要少,扫描索引时扫描的索引爷也少。至于后面的进行字段串那些操作时,为什么int反而更慢呢,是因为内部进行字符串函数处理时,要多进行一次类型的隐性转换。欢迎指正.
INT 4 字节
date 3 字节看不出有什么好处。 除非是取年,月,日的时候快一下 20090824 / 10000 = 2009
另外就是可以直接用于分区表。
索引或查询条件列拒绝空值,text默认空值.
一般选择占用空间小的类型,但短字符串一般用char.
考虑用枚举替代长字符串或不定长字符串.
考虑合并复合索引列.
选择适合于查询的类型,比如分级目录可以采用整数分位,拒绝类似fatherId的递归结构.
从查询效率的角度考虑看不到好处.
再说也不仅仅是内存问题,访问速度快的同时也提高了并发量.
我们很少有定长的字符类型,所以基本不用char,对于比较短且长度变化不大的字段,有些人喜欢用char,不过我一般还是会选用varchar,以前简单测试过,插入和查询性能差别不大,存储空间上varchar也只比实际长度多占用1-2个字节。另外char和varchar对尾部空格的处理不太一样,char截断尾部空格,varchar则会保留,当然查询比较时,MySQL都不会考虑尾部空格。
对于varchar和text的选择,我们会结合应用实际情况来考虑,如果该列数据一般情况下是与其他列一起查询出来的,就倾向与varchar(mysql5.0的varchar已经支持到65535长),如果列表时很少用到,只是在按主键查询时用到,就会考虑text。
没做过比较,一直认为字符型比较运算比int要慢。
不知道好处在哪里,所以我们一直用date,显示查询比较都很方便,也不需要转来转去很麻烦,也不觉得用int效率会高多少,date数据库内部处理也是当int型吧
enum是mysql特有的,我们也很少用,都是自己用tinyint,smallint等,另外建个数据字典表,程序上缓存起来自己需要时做转换。
我听到的版本是:
假如CHAR和VARCHAR多分配10个,如果VARCHAR插入的数据是10时,那么将多占1位,而如果不满足最大(10)的情况下,将占用较低的空间,是这样的。
字面意思是枚举,有点想 “ 或 ”的概念,类似if。手册中的解释是:
枚举类型。只能有一个值的字符串,从值列'value1','value2',...,NULL中或特殊 ''错误值中选出。ENUM列最多可以有65,535个截然不同的值。ENUM值在内部用整数表示。
例如我设置sex字段为 enum('1','0')那么我insert的时候,不管我是123 还是 3 还是“啊”,如果不符合1或0,那么就插入空。好像是这样,很少用它,因为数据设计经常在变~呵呵。
MySQL数据库数据类型之ENUM、SET、BOOL/BOOLEAN、TINYINT特性介绍MySQL数据库之布尔类型、枚举类型和集合类型的应用场景详解MySQL数据库数据类型之枚举类型ENUM数据测试总结MySQL数据库之枚举数据类型ENUM的DDL变更测试