一般情况下,设计表时,考虑到数据能存就可以了,往往在数据类型的细微选择上有所忽略
其实,一个字段的数据类型,对表数据存储所占的空间、索引的组织及其所占的空间,从而由此引起的硬盘IO的数量大小都是有关系的。
所以,请大家谈谈对各种数据类型的认识、相互比较及用法经验...等方面。

解决方案 »

  1.   

    先提一个:mysql类型 char、varchar 与 text 有什么区别,平时如何的选择?
      

  2.   

    讨论下int和Integer的区别吧
    int 默认是0 Integer默认是null 这个问题很棘手?大侠们有什么意见?
      

  3.   

    要讨论,char(10) 分配10个 占用10个   varchar(10)  分配10个,但是占用多少根据你放入的值来决定,Text就不清楚了。
      

  4.   


    简单的说:
    char 是固定宽度的,所以 'A' , 'ABCDED' 占用的宽度都是一样。会有存储空间上的浪费, 但如果表中的记录是固定宽度,显示速度上会提高很多。varchar 与 char 相反,是变长的,优缺点也与char 相反。text 是一种 blob 的存储。 一般不做为索引字段。仅保存。
      

  5.   


    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>
      

  6.   

    在数据范围上的区别如下(留意红色部分):CHAR(M)
    固定长度字符串,当保存时在右侧填充空格以达到指定的长度。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类型。
      

  7.   

    int类型与字符类型的选择:如需保存内容为1234567890,性能比较如何?
      

  8.   

    int与日期类型的选择:如日期2009-08-24,考虑转换为20090824的好处在哪?
      

  9.   

    mysql中提供的enum类型,在字段内容类别较少时(假如每个内容的类别有15个字符,表记录有5亿条),也是个很好的选择吗?请具体谈谈好处
      

  10.   


    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 较好
      

  11.   


    内因是这样吧:
    从存储上int所耗的空间要少,所以,也意味着在同等记录数下(当然只考虑除了这个字段外其他字段均相同啦),则查找相同记录数时,同等查询条件和索引时,INT所要扫描的数据页数量要少。
    同时,该列为索引时,int所占的索引页也要少,扫描索引时扫描的索引爷也少。至于后面的进行字段串那些操作时,为什么int反而更慢呢,是因为内部进行字符串函数处理时,要多进行一次类型的隐性转换。欢迎指正.
      

  12.   


    INT 4 字节
    date 3 字节看不出有什么好处。 除非是取年,月,日的时候快一下 20090824 / 10000 = 2009
    另外就是可以直接用于分区表。
      

  13.   

    本帖最后由 ACMAIN_CHM 于 2009-08-24 20:33:13 编辑
      

  14.   

    列类型应该根据查询而定.
    索引或查询条件列拒绝空值,text默认空值.
    一般选择占用空间小的类型,但短字符串一般用char.
    考虑用枚举替代长字符串或不定长字符串.
    考虑合并复合索引列.
    选择适合于查询的类型,比如分级目录可以采用整数分位,拒绝类似fatherId的递归结构.
    从查询效率的角度考虑看不到好处.
      

  15.   

    中小数据量的简单项目可以这样说,大数据量或复杂需求情况下的mssql 64G内存也会吃光的.
    再说也不仅仅是内存问题,访问速度快的同时也提高了并发量.
      

  16.   


    我们很少有定长的字符类型,所以基本不用char,对于比较短且长度变化不大的字段,有些人喜欢用char,不过我一般还是会选用varchar,以前简单测试过,插入和查询性能差别不大,存储空间上varchar也只比实际长度多占用1-2个字节。另外char和varchar对尾部空格的处理不太一样,char截断尾部空格,varchar则会保留,当然查询比较时,MySQL都不会考虑尾部空格。
    对于varchar和text的选择,我们会结合应用实际情况来考虑,如果该列数据一般情况下是与其他列一起查询出来的,就倾向与varchar(mysql5.0的varchar已经支持到65535长),如果列表时很少用到,只是在按主键查询时用到,就会考虑text。
      

  17.   


    没做过比较,一直认为字符型比较运算比int要慢。
      

  18.   


    不知道好处在哪里,所以我们一直用date,显示查询比较都很方便,也不需要转来转去很麻烦,也不觉得用int效率会高多少,date数据库内部处理也是当int型吧
      

  19.   


    enum是mysql特有的,我们也很少用,都是自己用tinyint,smallint等,另外建个数据字典表,程序上缓存起来自己需要时做转换。
      

  20.   


    我听到的版本是:
    假如CHAR和VARCHAR多分配10个,如果VARCHAR插入的数据是10时,那么将多占1位,而如果不满足最大(10)的情况下,将占用较低的空间,是这样的。
      

  21.   


    字面意思是枚举,有点想  “ 或 ”的概念,类似if。手册中的解释是:
    枚举类型。只能有一个值的字符串,从值列'value1','value2',...,NULL中或特殊 ''错误值中选出。ENUM列最多可以有65,535个截然不同的值。ENUM值在内部用整数表示。
    例如我设置sex字段为 enum('1','0')那么我insert的时候,不管我是123 还是 3 还是“啊”,如果不符合1或0,那么就插入空。好像是这样,很少用它,因为数据设计经常在变~呵呵。
      

  22.   

    读完了,回复楼上的:1、“date数据库内部处理也是当int型吧”,是的,是转为INT型保存;2、数据类型的讲究,不仅影响内存,在我看来,更重要的是影响I/0,楼上有朋友说了影响并发,也是对的,共同学习。
      

  23.   

    给大家介绍三种数据类型:布尔类型、枚举类型、集合类型
    MySQL数据库数据类型之ENUM、SET、BOOL/BOOLEAN、TINYINT特性介绍MySQL数据库之布尔类型、枚举类型和集合类型的应用场景详解MySQL数据库数据类型之枚举类型ENUM数据测试总结MySQL数据库之枚举数据类型ENUM的DDL变更测试