Mysql中的字段类型:enum 和 set,各是什么啊?怎样使用呢

解决方案 »

  1.   

    MYSQL的解释:
    11.4.4. ENUM类型
    ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。在某些情况下,ENUM值也可以为空字符串('')或NULL:·         如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不同,该字符串有数值值0。后面有详细讨论。·         如果将ENUM列声明为允许NULL,NULL值则为该列的一个有效值,并且 默认值为NULL。如果ENUM列被声明为NOT NULL,其默认值为允许的值列的第1个元素。每个枚举值有一个索引:·         来自列规定的允许的值列中的值从1开始编号。·         空字符串错误值的索引值是0。这说明你可以使用下面的SELECT语句来找出分配了非法ENUM值的行:·                mysql> SELECT * FROM tbl_name WHERE enum_col=0;
    ·         NULL值的索引是NULL。例如,定义为ENUM的列('one','two','three')可以有下面所示任何值。还显示了每个值的索引:值
     索引
     
    NULL
     NULL
     
    ''
     0
     
    'one'
     1
     
    'two'
     2
     
    'three'
     3
     枚举最多可以有65,535个元素。当创建表时,ENUM成员值的尾部空格将自动被删除。当检索时,保存在ENUM列的值使用列定义中所使用的大小写来显示。请注意可以为ENUM列分配字符集和 校对规则。对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写。如果在数值上下文中检索一个ENUM值,将返回列值的索引。例如,你可以这样从ENUM列搜索数值值:mysql> SELECT enum_col+0 FROM tbl_name;
    如果将一个数字保存到ENUM列,数字被视为索引,并且保存的值是该索引对应的枚举成员。(但是,这不适合LOAD DATA,它将所有输入视为字符串)。不建议使用类似数字的枚举值来定义一个ENUM列,因为这很容易引起混淆。例如,下面的列含有字符串值'0'、'1'和'2'的枚举成员,但数值索引值为1、2和3:numbers ENUM('0','1','2')
    根据枚举成员在列定义中列出的顺序对ENUM值进行排序。(换句话说,ENUM值根据索引编号进行排序)。例如,对于ENUM('a','b'),'a'排在'b'前面,但对于ENUM('b','a'),'b'排在'a'前面。空字符串排在非空字符串前面,并且NULL值排在所有其它枚举值前面。要想防止意想不到的结果,按字母顺序规定ENUM列。还可以使用GROUP BY  CAST(col AS CHAR)或GROUP BY  CONCAT(col)来确保按照词汇对列进行排序而不是用索引数字。如果你想要确定一个ENUM列的所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE enum_col,并解析输出中第2列的ENUM定义。11.4.5. SET类型
    SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开。这样SET成员值本身不能包含逗号。例如,指定为SET('one', 'two') NOT NULL的列可以有下面的任何值:''
    'one'
    'two'
    'one,two'
    SET最多可以有64个不同的成员。当创建表时,SET成员值的尾部空格将自动被删除。当检索时,保存在SET列的值使用列定义中所使用的大小写来显示。请注意可以为SET列分配字符集和 校对规则。对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写。MySQL用数字保存SET值,所保存值的低阶位对应第1个SET成员。如果在数值上下文中检索一个SET值,检索的值的位设置对应组成列值的SET成员。例如,你可以这样从一个SET列检索数值值:mysql> SELECT set_col+0 FROM tbl_name;
    如果将一个数字保存到SET列中,数字中二进制表示中的位确定了列值中的SET成员。对于指定为SET('a','b','c','d')的列,成员有下面的十进制和二进制值:SET成员
     十进制值
     二进制值
     
    'a'
     1
     0001
     
    'b'
     2
     0010
     
    'c'
     4
     0100
     
    'd'
     8
     1000
      如果你为该列分配一个值9,其二进制形式为1001,因此第1个和第4个SET值成员'a'和'd'被选择,结果值为 'a,d'。对于包含多个SET元素的值,当插入值时元素所列的顺序并不重要。在值中一个给定的元素列了多少次也不重要。当以后检索该值时,值中的每个元素出现一次,根据表创建时指定的顺序列出元素。例如,假定某个列指定为SET('a','b','c','d'):mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
    插入值'a,d'、'd,a'、'a,d,d'、'a,d,a'和'd,a,d': mysql> INSERT INTO myset (col) VALUES 
    -> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
    Query OK, 5 rows affected (0.01 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    当检索时所有这些值显示为 'a,d':mysql> SELECT col FROM myset;
    +------+
    | col  |
    +------+
    | a,d  |
    | a,d  |
    | a,d  |
    | a,d  |
    | a,d  |
    +------+
    5 rows in set (0.04 sec)
    如果将SET列设置为一个不支持的值,则该值被忽略并发出警告:mysql> INSERT INTO myset (col) VALUES ('a,d,d,s');
    Query OK, 1 row affected, 1 warning (0.03 sec)
     
    mysql> SHOW WARNINGS;
    +---------+------+------------------------------------------+
    | Level   | Code | Message                                  |
    +---------+------+------------------------------------------+
    | Warning | 1265 | Data truncated for column 'col' at row 1 |
    +---------+------+------------------------------------------+
    1 row in set (0.04 sec)
     
    mysql> SELECT col FROM myset;
    +------+
    | col  |
    +------+
    | a,d  |
    | a,d  |
    | a,d  |
    | a,d  |
    | a,d  |
    | a,d  |
    +------+
    6 rows in set (0.01 sec)
    SET值按数字顺序排序。NULL值排在非NULL SET值的前面。通常情况,可以使用FIND_IN_SET()函数或LIKE操作符搜索SET值:mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
    mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
    第1个语句找出SET_col包含value set成员的行。第2个类似,但有所不同:它在其它地方找出set_col包含value的行,甚至是在另一个SET成员的子字符串中。下面的语句也是合法的:mysql> SELECT * FROM tbl_name WHERE set_col & 1;
    mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
    第1个语句寻找包含第1个set成员的值。第2个语句寻找一个确切匹配的值。应注意第2类的比较。将set值与'val1,val2'比较返回的结果与同'val2,val1'比较返回的结果不同。指定值时的顺序应与在列定义中所列的顺序相同。如果想要为SET列确定所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE set_col并解析输出中第2列的SET定义。
      

  2.   

    MYSQL的文档中已经有了详细解释MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
      

  3.   

    3.ENUM mysql> create table test5(en enum('A','B'));mysql> insert test5 select 'a';mysql> insert test5 select null;mysql> select * from test5;+------+| en   |+------+| A    || NULL |+------+mysql> insert test5 select 'c';mysql> show warnings;+-------+------+-----------------------------------------+| Level | Code | Message                                 |+-------+------+-----------------------------------------+| Error | 1265 | Data truncated for column 'en' at row 1 |+-------+------+-----------------------------------------+在我的5.1测试版本上 插入的值如果有必要,会转化成大写;再插入枚举列表以外的值,出错;在5.0中,插入枚举列表以外的值,自动转化成枚举列表的第一个值; 
    4.SET类型mysql> create table test6(col SET('1','2','3','a','6'));mysql> insert test6 values('1,2'),('1,2,3,a'),('1,1,2,2,3,3');mysql> select * from test6;+---------+| col     |+---------+| 1,2     || 1,2,3,a || 1,2,3   |+---------+mysql> insert test6 select 'ak47';mysql> show warnings;+-------+------+------------------------------------------+| Level | Code | Message                                  |+-------+------+------------------------------------------+| Error | 1265 | Data truncated for column 'col' at row 1 |+-------+------+------------------------------------------+
    可以插入任意组合的值,当输入重复的枚举值的时候会自动去重;当插入不存在的组合时候,报错;本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/feixianxxx/archive/2010/05/14/5592888.aspx