bestlong 怕失憶論壇's Archiver

bestlong 發表於 2010-4-10 00:44

Firebird 不支援 Boolean 資料型態的替代方案

1. 使用 smallint 0->False, 1->True
2. 使用 char(1), 'Y' or 'T' -> True, 'N' or 'F' -> False
3. 使用 varchar(1), 'Y' or 'T' -> True, 'N' or 'F' -> False

bestlong 發表於 2010-4-10 00:46

在 KTop 的討論
[url]http://delphi.ktop.com.tw/board.php?cid=18&fid=1497&tid=91344[/url]

節錄其中 P.D. 版主的經驗分享

做為 boolean 的欄位最好使用 char 格式, 因為 varchar 有 null 值的認定, 也就是該欄位不填入 F 就是NULL, 如果你想判斷非T的欄位, 這樣寫的 SQL 一定有問題 MYFIELD <> 'T', 因為這樣無法抓出 NULL 值, 正確的寫法是 MYFILED <> 'T' or MYFILED IS NOT NULL 但如果使用 CHAR(1) 的話, 就可以寫 MYFIELD <> 'T' 就一定錯不了, 因為 FB 為自動為 CHAR 填入 CHR(32), 絶對不會是 NULL

bestlong 發表於 2010-4-10 21:22

No BOOLEAN field in Firebird?

There is no built-in boolean field, but you have several options:

1. use char(1)
2. use smallint
3. use domains

Domains are probably the best solution. You can create domain like this:


CREATE DOMAIN BOOLEAN
AS SMALLINT
CHECK (value is null or value in (0, 1));


Later in table definition you can refer to it as a regular datatype.


CREATE TABLE t1
(
C1 VARCHAR(10),
B1 BOOLEAN,
B2 BOOLEAN NOT NULL,
...
);


If you use a connectivity library like OleDB under .Net, you can override the OleDB provider's GetSchema method, so the DataTables you get from queries have native .Net booleans.


參考來源 [url]http://grandruru.blogspot.com/2010/03/no-boolean-field-in-firebird.html[/url]
頁: [1]

Powered by Discuz! X1.5 Archiver   © 2001-2010 Comsenz Inc.