2008年12月12日星期五

Mysql enum & int 使用情况 (mysql没有必要枚举整型)

写程序时如果用到数据库建议向sqlite看齐,sqlite可没有enum.

Enum: 多用于固定不变的一些数据内容
比如:周一,周二,周三,,,,,,周日

Tinyint: 多用于表示状态(0,1,2,3....), 性能上来说不比 enum差.

Enum存取数据内容时是整型数据,也会把数据转为字符串来处理.
Tinyint存取是整型就是整型.


另外:
数据表有字段: Status enum('0','1','2','3') default 0;

update table set `Status`=0; //这时查看数据内容结果 Status='';

如果Status tinyint default 0; //同样操作数据内容就是 Statsus=0;


-------------------------------------------------------------------

mysql没有必要枚举整型

有些人习惯地把一些状态表示为整型,在mysql存储这些整型时,却转化成字符串,存在了枚举型的列中。这是不必要的。因为在mysql存储这

些枚举字符串时是把这样字符串做一个序列(index),然后存储相应的index值,比如

Enum_value index
NULL NULL 如果NULL是被允许的话
'' 0 一切在在插入时,被视为非法值的字符串,插入的都为空
'a' 1
'b' 2
... ...

也就是说,我们在插入值时,是插入的'a','b'等等字符串,但Mysql真正存储是则是右边的index.如果真得左边的ENUM也为整型值,则是不可取的。因为:
If you store a number into an ENUM column, the number is treated as an index, and the value stored is the enumeration member

with that index. (However, this does not work with LOAD DATA, which treats all input as strings.) It's not advisable to

define an ENUM column with enumeration values that look like numbers, because this can easily become confusing. For example,

the following column has enumeration members with string values of '0', '1', and '2', but numeric index values of
1, 2, and 3.

ENUM的最多的个数也证明了这一点。
An enumeration can have a maximum of 65,535 elements.

同时,都知道程序的需求变化很快,尤其是WEB类的脚本程序。ENUM在表示状态时,也会面临着扩展状态所带来困扰。你必须改变表结构新的值被允许存入。

建议:表示状态类的最好用TINYINT。枚举不是不行,但至少它不是最好。

没有评论: