Mysql mode與 enum 類型

Mysql mode與 enum 類型

from:http://www.51CTO提醒您,請勿濫發廣告!/viewthread.php?tid=1015483

1.sql mode簡介

在Mysql中,sql mode可以用來解決以下問題
(1).通過設置不同的sql mode,可以在不同嚴格程序進行數據校驗.有效地保證了數據準確性.
(2).通過設置sql mode爲ANSI模式,來保證大多數SQL符合標準SQL的語法,這樣在不同數據庫之間遷移時,不需要對業務 修改太多.

在Mysql 5.0以下,查詢默認的sql mode(sql mode參數)有:real_as_float,pipes_as_concat,ansi_quotes,gnore_space和ANSI。在這些模式下可以插入超過字段定義長度的數據,或是在字段中沒有定義的元素數據(如,enum)。不過在插入後會有一個warning(可以用 show warnings來查看)。

可以通過設置sql mode爲STRICT_TRANS_TABLES(嚴格模式)來實現數據的嚴格校檢,使錯誤數據不能插入,從而保證數據準確性。

TRADITIONAL模式也屬於嚴格模式,同樣可以實現嚴格校檢,使錯誤數據不能插入,從而保證數據準確性。不過在這種模式MAX(X,0)返回的結果是NULL,所以在包含有MAX的運算中根據實際情況設定好sql mode.

2.ENUM簡介

ENUM是一個字符串對象,其值來自表創建時在列規定中顯式枚舉的一列值。
在某些情況下,ENUM值也可以爲空字符串('')或NULL:
如果你將一個非法值插入ENUM(也就是說,允許的值列之外的字符串),將插入空字符串以作爲特殊錯誤值。該字符串與“普通”空字符串不同,該字符串有數值值0。
如果將ENUM列聲明爲允許NULL,NULL值則爲該列的一個有效值,並且 默認值爲NULL。如果ENUM列被聲明爲NOT NULL,其默認值爲允許的值列的第1個元素。

每個枚舉值有一個索引:

來自列規定的允許的值列中的值從1開始編號。
空字符串錯誤值的索引值是0。這說明你可以使用下面的SELECT語句來找出分配了非法ENUM值的行:
select * from test where browsertype=0;

NULL值的索引是NULL。

例如,定義爲ENUM的列('one','two','three')可以有下面所示任何值。還顯示了每個值的索引:

值            索引
NULL       NULL
1            'one'
2             'two'
3           'three'

枚舉最多可以有65,535個元素。
當創建表時,ENUM成員值的尾部空格將自動被刪除。
當檢索時,保存在ENUM列的值使用列定義中所使用的大小寫來顯示。請注意可以爲ENUM列分配字符集和 校對規則。對於二進制或大小寫敏感的校對規則,當爲列分配值時應考慮大小寫。

3.舉列測試

(1)sql mode爲ANSI

mysql> create table test(id bigint(20) auto_increment primary key,
-> browsertype enum('ie','firefox','other')
-> );
Query OK, 0 rows affected (0.10 sec)

mysql> desc test;
+-------------+------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| browsertype | enum('ie','firefox','other') | YES | | NULL | |
+-------------+------------------------------+------+-----+---------+----------------+
2 rows in set (0.05 sec)

mysql> set session sql_mode='ANSI';
Query OK, 0 rows affected (0.14 sec)

mysql> insert into test(browsertype) values('ie') ;
Query OK, 1 row affected (0.07 sec)

mysql> insert into test(browsertype) values('maxthon') ;
Query OK, 1 row affected (0.03 sec)

mysql> show warnings;(數據雖然成功insert,但有warning)
+---------+------+--------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------+
| Warning | 1265 | Data truncated for column 'browsertype' at row 1 |
+---------+------+--------------------------------------------------+
1 row in set (0.01 sec)

mysql> select * from test;
+----+-------------+
| id | browsertype |
+----+-------------+
| 1 | ie |
| 2 | |
+----+-------------+
2 rows in set (0.01 sec)

mysql> select * from test where browsertype=0;(空字符串錯誤值的索引值是0。SELECT可找出分配了非法ENUM值的行)
+----+-------------+
| id | browsertype |
+----+-------------+
| 2 | |
+----+-------------+
1 row in set (0.04 sec)
(2)使用嚴格模式(STRICT_TRANS_TABLES)

mysql> set session sql_mode='STRICT_TRANS_TABLES';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode;
+---------------------+
| @@sql_mode |
+---------------------+
| STRICT_TRANS_TABLES |
+---------------------+
1 row in set (0.00 sec)

mysql> select * from test;
+----+-------------+
| id | browsertype |
+----+-------------+
| 1 | ie |
| 2 | |
+----+-------------+
2 rows in set (0.00 sec)

mysql> insert into test(browsertype) values('maxthon') ;
ERROR 1265: Data truncated for column 'browsertype' at row 1

mysql> insert into test(browsertype) values('firefox') ;
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+----+-------------+
| id | browsertype |
+----+-------------+
| 1 | ie |
| 2 | |
| 3 | firefox |
+----+-------------+
3 rows in set (0.00 sec)

(3) TRADITIONAL模式

mysql> create table t11 (i int);
Query OK, 0 rows affected (0.02 sec)

mysql> set sql_mode='ANSI';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t11 values(9%4);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t11;
+------+
| i |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

mysql> set sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t11 values(9%0);
ERROR 1365: Division by 0

mysql> show warnings;
+-------+------+---------------+
| Level | Code | Message |
+-------+------+---------------+
| Error | 1365 | Division by 0 |
+-------+------+---------------+
1 row in set (0.02 sec)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章