编写了n年的T-SQL,一回头,发现这门语言居然缺少很多基本的类型。
1.枚举
虽然枚举看起来就是数字,但是枚举比起数字来说更加好读。mysql有enum,比如billtype(单据类型)把它定义为枚举,从而在编写sql的时候更加方便。
mysql支持枚举案例:
mysql> CREATE TABLE enum_test(
e ENUM('fish', 'apple', 'dog') NOT NULL
);
INSERT INTO enum_test(e) VALUES('fish'), ('dog'), ('apple');
用字符串表达数字,并且和数字的效率一样高,还可以做in操作,虽然不太完美,但是也在完美的路上了。更细节的,如果插入的不在规定范围内,mysql会把它当成null处理,这点不太好。
比如我们常常会遇到这样的代码:
sql = @"select 0 buytotal,-(ifnull(sum(if(bill.vchtype in (34,6,66,28) ...";
如果支持枚举的话,代码应该类似:
sql = Foo(@"select 0 buytotal,-(ifnull(sum(if(dlya.vchtype in (vchtype.billsale,vchtype.billbuy) ...";
感觉就会好很多了。
可是 Sqlserver 只能用int来代替。
2. 布尔类型
无论列定义,还是TSQL变量,参数,都不支持bool类型,智能用bit模拟。显然1/0,不如 true/false 更好阅读和使用。
3. 数组
Sql2008 有表变量的支持,聊胜于无。 数组,多常用的类型!
4. 类(class)
尽管类比一般的类型要复杂的多,可是类依然是类型。sqlserver也是没有这样的类型的。
以我们的产品为例,动则几百个存储过程,这样的复杂度,当然就有了分层和封装的需求。可是sqlserver并不能很好的支持我们的想法。再说定义聚集函数这样的特殊功能,用oracle,就采用sql就可以做到——因为它支持类和包。在sqlserver,mysql要做这样的聚集函数,都必须用dll,麻烦啊。
人的适应能力真强,想起刚刚用php之类的语言,连调试器也没有,用print一路的也过来了。不过毕竟过的不爽。
注:oracle方面的内容都是来自资料,自己并无亲自测试。