老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

MySQL中enum插入的注意事項有哪些

MySQL中enum插入的注意事項有哪些,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

創新互聯建站主要從事成都網站建設、成都做網站、網頁設計、企業做網站、公司建網站等業務。立足成都服務梁山,十載網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:13518219792

今天在執行開發發過來的工單的時候,source批量導入執行時候發現報了很多警告 提示 truncate for column xxxxx 。導入完成后,使用select查詢后,發現大量數據未成功插入。

后來發現是enum字段沒有加引號搞的鬼。

結論:

   enum的字段,在插入的時候,必須帶上引號。否則會出現不可預期的問題。

驗證過程如下:

[none] > use test;

[test] > create table t1(

a int primary key auto_increment,

b enum('4','3','2','1') default '3');

[test] > INSERT INTO t1 (b) VALUES (4);

Query OK, 1 row affected

Time: 0.012s

[test] > INSERT INTO t1 (b) VALUES ('4');

Query OK, 1 row affected

Time: 0.012s

[test] > SELECT * from t1;

+-----+-----+

|   a |   b |

|-----+-----|

|   1 |   1 |    --->  這里我們執行的是 INSERT INTO t1 (b) VALUES (4);    結果卻插入的是數值1,和我們實際上的目標結果完全不一致。

|   2 |   4 |    --->  這里我們執行的是 INSERT INTO t1 (b) VALUES ('4');  這里插入帶引號的4,和我們的預期結果一致。

+-----+-----+

原因: 

  enum類型的字段插入數值的時候, 帶引號的時候,插入的才是真正的數值。 如果不帶引號插入的話,實際上是插入的key(如上面的例子中 INSERT INTO t1 (b) VALUES (4),插入的是b列第四個default值,也就是取enum('4','3','2','1')第四個默認值,即最終插入的是數值1)。

試驗,寬松sql_mode下的插入情況:

[test] > set session sql_mode='';

[test] > INSERT INTO t1 (b) VALUES (5);   ---> 插入一個超出enum下標范圍的值

Query OK, 1 row affected

Time: 0.012s

[test] > INSERT INTO t1 (b) VALUES ('5');   ---> 插入一個不在enum允許的值

Query OK, 1 row affected

Time: 0.011s

[test] > SELECT * from t1;

+-----+-----+

|   a | b   |

|-----+-----|

|   1 | 1   |

|   2 | 4   |

|   3 |     |

|   4 |     |

+-----+-----+

[test] > SELECT * from t1 where b = '';

+-----+-----+

|   a | b   |

|-----+-----|

|   3 |     |

|   4 |     |

+-----+-----+

[test] > SELECT * from t1 where b is null;

+-----+-----+

| a   | b   |

|-----+-----|

+-----+-----+

可以看到在sql_mode為空的時候,雖然插入的時候沒有報錯,但是實際上查詢是沒有結果的,(查出來后插入的2行的b是''空值,不是NULL)。

繼續試驗,嚴格的sql_mode下異常插入的情況:

[test] > set session sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

[test] > INSERT INTO t1 (b) VALUES ('5');

(1265, u"Data truncated for column 'b' at row 1")

[test] > INSERT INTO t1 (b) VALUES (5);

(1265, u"Data truncated for column 'b' at row 1")

可以看到嚴格的sql_mode下,我們的異常插入就直接報錯了。

ENUM枚舉

    一般不建議使用,后期不便于擴展。任何不在枚舉的范圍的值插入都會報錯,一般用tinyint替代ENUM比較合適。

     ENUM的字段值不區分大小寫。如insert into tb1 values("M"); 和insert into tb1 values("m");效果一樣的。

補充:

enum的存儲原理:

(http://justwinit.cn/post/7354/?utm_source=tuicool&utm_medium=referral)

在建立enum類型的字段時,我們會給他規定一個范圍比如 enum('a','b','c'),這時mysql內部會建立一張hash結構的map表,類似:0000 -> a,0001 -> b,0002 -> c。

當我插入一條數據,此字段的值位a或b或c時,他存儲在里面的不是這個字符,而是對應他的索引,也就是那個0000或0001或0002。

同樣,enum在mysql手冊上的說明:

ENUM('value1','value2',...)

1或2個字節,取決于枚舉值的個數(最多65,535個值)

除非enum的個數超過了一定數量,否則他所占的存儲空間也總是1字節。

看完上述內容,你們掌握MySQL中enum插入的注意事項有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創新互聯行業資訊頻道,感謝各位的閱讀!


網站標題:MySQL中enum插入的注意事項有哪些
分享網址:http://www.xueling.net.cn/article/gecjih.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 亚州中文字幕 | 亚洲欧美日韩精品一区二区 | 亚洲国产97色在线张津瑜 | 日日婷婷夜日日天干A片 | 国产爆乳无码av在线播放 | 欧美18videos极品 | 久久一区福利视频国 | 国产精品片 | 久久精品国产一区 | 亚洲啪啪aⅴ一区二区三区9色 | 欧美噜噜噜 | 亚洲精视频 | 欧美激情性久久 | 大尺度露胸美女 | 久久久久国产精品熟女影院浪 | 久久99精品久久久久久久夜夜爽 | 91在线视频 | 天天摸天天操天天舔 | 99久久久久成人国产免费 | 国产伦精品一区二区三区视频1 | 国产成人欧美综合在线影院 | 饥渴少妇与三个黑人互动 | 国产在线无码永久免费 | 成人区精品一区二区婷婷 | 亚洲欧美在线视频观看 | 成人免费看片 | 欧洲成人午夜精品无码区久久 | 国产九九九精品视频 | 9l蝌蚪porny中文自拍 | 亚洲精品无码MV在线观看软件 | 老熟妇bbxxx视频 | 久久青青草原一区二区 | 精品国产免费一区二区三区香蕉 | 国产日产欧产精品 | 极品无码国模国产在线观看 | 兔兔精品国产乱码久久久久 | 久久99精品久久久久久国产越南 | 亚洲视屏在线观看 | 亚洲精品综合 | 欧美日韩国产激情一区 | 亚洲一区二区三区精品在线观看 |