程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> 如何在mysql中保存bool型的數據

如何在mysql中保存bool型的數據

編輯:MYSQL入門知識
 

本文將要介紹在mysql中如何設計一個bool型的字段,
方法有多種,各有利弊。

1) ENUM

把字段設計為 NOT NULL ENUM(‘F’,’T’) 或者 ENUM(‘N’,’Y’) 或者 ENUM(’0′,’1′)。
優點:
看起來很簡單,也很直觀。
只占用一個字節。
限制了字段的值,其它錯誤的值就無法寫入,比如’A’。
事實上,mysql.user 就是這樣做的:


| USER | CREATE TABLE `user` (
`Host` CHAR(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` CHAR(16) COLLATE utf8_bin NOT NULL DEFAULT '',
`Password` CHAR(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
`Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
.....
 

缺點:
enum字段其實是數字型的, 並且是從1開始計數的…這就意味著’N’為1, ‘Y’為2。
這樣就會造成一個問題:


mysql> SHOW CREATE TABLE test;
+-------+-------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+-------+-------------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`priv` enum('N','Y') NOT NULL DEFAULT 'N'
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+-------+-------------------------------------------------------------------------------------------------+
1 ROW IN SET (0.00 sec)
mysql> SELECT * FROM test;
+------+
| priv |
+------+
| N |
| Y |
+------+
2 ROWS IN SET (0.00 sec)
mysql> SELECT priv FROM test WHERE priv=1;
+------+
| priv |
+------+
| N |
+------+
1 ROW IN SET (0.00 sec)

mysql> SELECT priv FROM test WHERE priv=2;
+------+
| priv |
+------+
| Y |
+------+
1 ROW IN SET (0.00 sec)

mysql> SELECT IF(priv, 'true', 'false') FROM test;
+---------------------------+
| IF(priv, 'true', 'false') |
+---------------------------+
| TRUE |
| TRUE |
+---------------------------+
2 ROWS IN SET (0.00 sec)
 

數字1與2在if語句中都為true。雖然priv看起來是一個bool型的字段,但是它在if中的表現完全是錯的。

並且,ENUM(’0′,’1′) 這種做法實在是不可取的,絕對不推薦在ENUM中使用數字。

而且ENUM字段本身還有一些弊端:
1. 如果改變ENUM字段的定義,可能會造成整個表數據的更新。
比如某字段原來的定義為 ENUM(“Y”,”N”), N會存儲為2;
改成ENUM(“Y”,”A”,”N”)之後,N變成了3,所以原表中所有為N的記錄都會被修改(為3)。

2. ENUM字段上的ORDER BY,會有奇怪的表現。


mysql> create table test8 (priv enum("apple", "zombie", "book", "cat") default "apple");
Query OK, 0 rows affected (0.02 sec)

mysql> select * from test8;
+--------+
| priv |
+--------+
| apple |
| book |
| cat |
| zombie |
+--------+

mysql> select * from test8 order by priv;
+--------+
| priv |
+--------+
| apple |
| zombie |
| book |
| cat |
+--------+
 

可以看到,在priv字段上做orderby 操作, 並沒有按照字母順序來排序,而是按照它們出現在enum定義中的順序。

2) CHAR(1)

CHAR(1)也寫直觀,用’F’表示false, ‘T’表示true。
仍舊占用一個字節(即使字符集為utf8)。
但是很顯然,有可能會寫入錯誤的值,比如’花’。
而且在if語句中,它們都表現為false。


mysql> SHOW CREATE TABLE test;
+-------+------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+-------+------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`priv` CHAR(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------+
1 ROW IN SET (0.00 sec)

mysql> SELECT * FROM test;
+------+
| priv |
+------+
| T |
| F |
| 花 |
+------+
3 ROWS IN SET (0.00 sec)

mysql> SELECT LENGTH(priv) FROM test;
+--------------+
| LENGTH(priv) |
+--------------+
| 1 |
| 1 |
| 3 |
+--------------+
3 ROWS IN SET (0.00 sec)

mysql> SELECT IF(priv,"TRUE","FALSE") FROM test;
+-------------------------+  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved