27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]
E-mail:mzze@163.com
Q Q:32362389
W X:xiaomi168527
27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]
大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]
E-mail:97157726@qq.com
Q Q:97157726
枚举(enum)
mysql的枚举;从集合中单选一个值作为数据
语法:
enum('值1','值2','值3')
案例:
mysql> create table stu12( -> name varchar(20), -> sex enum('男','女','保密') # 枚举 -> ); Query OK, 0 rows affected (0.06 sec) -- 插入的枚举值只能是枚举中提供的选项 mysql> insert into stu12 values ('tom','男'); Query OK, 1 row affected (0.00 sec) -- 报错,只能插入男、女、保密 mysql> insert into stu12 values ('tom','不告诉你'); ERROR 1265 (01000): Data truncated for column 'sex' at row 1
枚举值是通过整形数字来管理的,第一个值是1,第二个值是2,以此类推,枚举值在数据库存储的是整形数字。
mysql> insert into stu12 values ('berry',2); -- 插入数字 Query OK, 1 row affected (0.00 sec) mysql> select * from stu12; +-------+------+ | name | sex | +-------+------+ | tom | 男 | | berry | 女 | +-------+------+ mysql> select * from stu12 where sex=2; -- 2表示第二个枚举值 +-------+------+ | name | sex | +-------+------+ | berry | 女 | +-------+------+ 1 row in set (0.00 sec)
枚举在进行数据规范的时候(定义的时候),系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中);然后在进行数据插入的时候,系统自动将字符转换成对应的数字存储,然后在进行数据提取的时候,系统就自动将数字转换成字符串显示。
(1)限定值的可能性
(2)节省空间
(3)运行速度快(整形比字符串运行速度快)
站在 mysql的角度,尽量多用集合!
但是站在php操作mysql的角度,尽量少用!(兼容性差)
拓展:mysql集合
在mysql中设置某一字段类型为enum,但是存的值为数字,比如‘0’,‘1’,‘2’;
解释1:你可能会混淆,因为enum可以通过角标取值,但它的角标是从1开始,对于不熟悉这个字段的人这里会出错
解释2:enum类型的字段对于0与‘0’有非常大的区别,如果你是用0当角标做操作,因它没有这个角标,所要会报错;如果你使用‘0’这个值去取枚举值,并做插入操作,你会发现它竟然会成功,但是插入的结果是一个“空”(不是null)
解释3:enum类型对于php等弱语言类型的支持很差,弱语言类型打引号和不打引号的值可能是同一类型,但是对于mysql中enum类型的字段来说,那就不一定是一回事了
结论:总之,不要拿mysql的enum类型取存一些数字;如果你一定要使用这个字段去存数字,请把这个字段定义为int.
思考:已知枚举占用两个字节,所以最多可以有多少个枚举值?
答:1字节=8位;字节是二进制数据的单位。一个字节通常8位长
2字节=16位,如(0101011010100110) 2^16次方=65536,范围是(0-65535),由于枚举从1开始,所以枚举值最多有65535个
本站内容均为小米原创,转载请注明出处:小米技术社区>> mysql的枚举;从集合中单选一个值作为数据