作者liaosankai (低温烘焙)
看板PHP
标题Re: [讨论] 复选值的储存方式与比对
时间Sat Aug 30 13:29:13 2014
※ 引述《JYHuang (夏天到了,冷不起来了说)》之铭言:
: 网页上不管是checkbox或是multi-select,要将所选的值存入资料库。
: 目前想到的方式有两种
: 一种是在资料库开个表存主键和值。
: 一个是用php的serialize(或是implode)转成字串存在栏位。
: 前者比较直觉,SQL搜寻也比较容易(用WHERE `field` IN (A,B) 就好)
: 不过如果有一堆选项的话要开一堆表(或单一表用键值隔开)
: 在用POST更新时 除非是一次全部洗掉重加
: 也需要判断(存在的取消,不在的新增)之类的情类的。
: 後者比较省资料库的空间
: 不过搜寻跟比对上比较麻烦(要用 `field` like A or `field` like B
: 单笔更新的话也是整栏要洗掉重丢值
: 取值时则是要先判断是否能够unserialize.
: 除了这两种方式外
: 不知各位还有什麽样的作法?
: 用enum,set?
: 其实还是有点不清楚SET属性栏位如何作复数值的条件搜寻
先说明一下 MySQL 的 enum 和 set 两种资料类型。
1) 两种都是以「字串」方式储存资料,差在资料库会先帮你做检查。
2) 两种最多只能设定 64 组选项。
3) 设定栏位为 enum('male','female') 时,资料只能为'male'或'female'
选项中的其中一个,相当於 HTML 中的 radio。
4) 设定栏位为 set('red','green','blue') 时,资料为选项用逗号隔开
的字串组合。例如 'red,green' 或 'green' 或 'blue,red',相当於 HTML
中的 checkbox。
其中 set 有几个特性,
1) 一个是资料写入前,系统会自动把资料重新排序,像是 'blue,red'
就会重新被调整为 'red,blue' 再储存。
2) 如果写入的资料有重复的部分,会自动移除。像 'red,green,red,blue' 就
会被修正为 'red,green,blue'
3) 如果写入的资料含有不存在的选项,也会自动移除。像 'red,yellow,blue'
就会被修正为 'red,blue'
4) 另一个是 set 可接受选项以「2 的{顺序}次方」总合码(sum)来表示选项组合。
(2的0次方) red => 1,
(2的1次方) green => 2,
(2的2次方) blue => 4, ... 以此类推
当我想设定 'red,blue' 时,也可以直接设定数字 5 (1+4)
同理当我设定数字 7 时,表示为 'red,green,blue'。而且这个规则也可以
用在 WHERE 条件,像是 color = 3 和 color = 'red,green' 会是一样的。
5) MySQL 有一个针对 set 的搜寻语法 FIND_IN_SET
以上经验分享
--
欢迎来我的网志看看
@
http://blog.liaosankai.com
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.118.16.54
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/PHP/M.1409376561.A.F23.html
※ 编辑: liaosankai (122.118.16.54), 08/30/2014 13:30:53
1F:推 reso: 谢谢 08/30 13:34
2F:推 JYHuang: 感谢分享,相当实用的文章 09/01 09:01
3F:推 KawasumiMai: 超酷 09/01 10:42
4F:推 oread168: 实用 09/01 15:27