程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MYSQL STRICT_TRANS_TABLES使用圖解教程

MYSQL STRICT_TRANS_TABLES使用圖解教程

編輯:MySQL綜合教程


MYSQL STRICT_TRANS_TABLES使用圖解教程   mysql 在insert的時候,常常提示沒有默認值,MySQL 1364 錯誤提示:#1364 - Field "XXX" doesn't have a default value。XXX字段沒有默認的數值;也就是說我們沒有為其分配數值,而表中此字段也沒有設置默認值。這是mysql模式開啟存儲引擎啟用嚴格模式,非法數據值被拒絕, 我把操作實際問題貼一下圖:
MYSQL STRICT_TRANS_TABLES使用圖解教程
  而我的Tbl_User表裡面字段:    www.2cto.com  
MYSQL STRICT_TRANS_TABLES使用圖解教程
  解決方法:就是在mysql的配置文件my.ini裡面   XML/HTML代碼 01.# Set the SQL mode to strict # sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"  02.改為:  03.  04.sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"    把嚴格模式去掉,得啟mysql即可   貼一下網上有關模式詳細介紹: NO_AUTO_CREATE_USER   www.2cto.com   防止GRANT自動創建新用戶,除非還指定了密碼。 NO_UNSIGNED_SUBTRACTION  在減運算中,如果某個操作數沒有符號,不要將結果標記為UNSIGNED。請注意這樣使UNSIGNED BIGINT不能100%用於上下文中。   再貼一下其它幾種模式: 在mysql 5中,默認的是REAL_AS_FLOAT,PIPES_AS_CONTACT,ANSI_QUOTES,GNORE_SPACE和ANSI, 在這種模式下,允許插入超過字段長度的值,只是插入後,返回的是警告而不是錯誤,當用STRICT_TRANS_TABLES時, 則是錯誤了,嚴格的警告.   NO_AUTO_CREATE_USER   防止GRANT自動創建新用戶,除非還指定了密碼。 下面是手冊中的一些介紹   下面描述了支持的所有模式: · ALLOW_INVALID_DATES   在嚴格模式下不要檢查全部日期。只檢查1到12之間的月份和1到31之間的 日。這在Web應用程序中,當你從三個不同的字段獲取年、月、日,並且想要確切保存用戶插入的內容(不進行日期驗證)時很重要。該模式適用於DATE和 DATETIME列。不適合TIMESTAMP列,TIMESTAMP列需要驗證日期。   啟用嚴格模式後,服務器需要合法的月和日,不僅僅是分別在1到12和1到31范圍內。例如,禁用嚴格模式時’2004-04-31′是合法的,但啟用嚴格模式後是非法的。要想在嚴格模式允許遮掩固定日期,還應啟用ALLOW_INVALID_DATES。   www.2cto.com   · ANSI_QUOTES   將‘”’視為識別符引號(‘`’引號字符),不要視為字符串的引號字符。在ANSI模式,你可以仍然使用‘`’來引用識別符。啟用ANSI_QUOTES後,你不能用雙引號來引用字符串,因為它被解釋為識別符。   · ERROR_FOR_DIVISION_BY_ZERO   在嚴格模式,在INSERT或UPDATE過程中,如果被零除(或 MOD(X,0)),則產生錯誤(否則為警告)。如果未給出該模式,被零除時MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作結果為NULL。   · HIGH_NOT_PRECEDENCE   NOT 操作符的優先順序是表達式例如NOT a BETWEEN b AND c被解釋為NOT (a BETWEEN b AND c)。在一些舊版本MySQL中, 表達式被解釋為(NOT a) BETWEEN b AND c。啟用HIGH_NOT_PRECEDENCESQL模式,可以獲得以前的更高優先級的結果。 mysql>SET sql_mode = ‘’; mysql>SELECT NOT 1 BETWEEN -5 AND 5; -> 0 mysql>SET sql_mode = ‘broken_not’; mysql>SELECT NOT 1 BETWEEN -5 AND 5; -> 1  · IGNORE_SPACE   允許函數名和‘(’之間有空格。強制將所有函數名視為保存的字。結果是,如果你想要訪問保存為字的數據庫、表或列名,你必須引用它。例如,因為有USER()函數,mysql數據庫中的user表名和該表內的User列被保存下來,因此你必須引用它們: SELECT "User" FROM mysql."user";  · NO_AUTO_CREATE_USER   防止GRANT自動創建新用戶,除非還指定了密碼。   www.2cto.com   · NO_AUTO_VALUE_ON_ZERO NO_AUTO_VALUE_ON_ZERO影響AUTO_INCREMENT列的處理。一般情況,你可以向該列插入NULL或0生成下一個序列號。NO_AUTO_VALUE_ON_ZERO禁用0,因此只有NULL可以生成下一個序列號。   如果將0保存到表的AUTO_INCREMENT列,該模式會很有用。(不推薦采用該慣例)。例如,如果你用mysqldump轉儲表並重載,MySQL遇到0值一般會生成新的序列號,生成的表的內容與轉儲的表不同。重載轉儲文件前啟用NO_AUTO_VALUE_ON_ZERO可以解決該問題。mysqldump在輸出中自動包括啟用NO_AUTO_VALUE_ON_ZERO的語句。   · NO_BACKSLASH_ESCAPES 禁用反斜線字符(‘’)做為字符串內的退出字符。啟用該模式,反斜線則成為普通字符。   · NO_DIR_IN_CREATE 創建表時,忽視所有INDEX DIRECTORY和DATA DIRECTORY指令。該選項對從復制服務器有用。   · NO_ENGINE_SUBSTITUTION 如果需要的存儲引擎被禁用或未編譯,可以防止自動替換存儲引擎。   · NO_FIELD_OPTIONS 不要在SHOW CREATE TABLE的輸出中打印MySQL專用列選項。該模式在可移植模式(portability mode)下用於mysqldump。   · NO_KEY_OPTIONS   不要在SHOW CREATE TABLE的輸出中打印MySQL專用索引選項。該模式在可移植模式(portability mode)下用於mysqldump。   · NO_TABLE_OPTIONS   www.2cto.com   不要在SHOW CREATE TABLE的輸出中打印MySQL專用表選項(例如ENGINE)。該模式在可移植模式(portability mode)下用於mysqldump。   · NO_UNSIGNED_SUBTRACTION   在減運算中,如果某個操作數沒有符號,不要將結果標記為UNSIGNED。請注意這樣使UNSIGNED BIGINT不能100%用於上下文中。 · NO_ZERO_DATE   在嚴格模式,不要將 ‘0000-00-00′做為合法日期。你仍然可以用IGNORE選項插入零日期。在非嚴格模式,可以接受該日期,但會生成警告。   · NO_ZERO_IN_DATE   在嚴格模式,不接受月或日部分為0的日期。如果使用IGNORE選項,我們為類似的日期插入’0000-00-00′。在非嚴格模式,可以接受該日期,但會生成警告。   · ONLY_FULL_GROUP_BY   不要讓GROUP BY部分中的查詢指向未選擇的列。   · PIPES_AS_CONCAT   將||視為字符串連接操作符(+)(同CONCAT()),而不視為OR。   · REAL_AS_FLOAT   將REAL視為FLOAT的同義詞,而不是DOUBLE的同義詞。   · STRICT_TRANS_TABLES   為所有存儲引擎啟用嚴格模式。非法數據值被拒絕。   · STRICT_TRANS_TABLES   為事務存儲引擎啟用嚴格模式,也可能為非事務存儲引擎啟用嚴格模式。後面有詳細說明。   嚴格模式控制MySQL如何處理非法或丟失的輸入值。有幾種原因可以使一個值為非法。例如,數據類型錯誤,不適合列,或超出范圍。當新插入的行不包含某列的沒有顯示定義DEFAULT子句的值,則該值被丟失。  www.2cto.com     對於事務表,當啟用STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式時,如果語句中有非法或丟失值,則會出現錯誤。語句被放棄並滾動。   對於非事務表,如果插入或更新的第1行出現壞值,兩種模式的行為相同。語句被放棄,表保持不變。如果語句插入或修改多行,並且壞值出現在第2或後面的行,結果取決於啟用了哪個嚴格選項:   · 對於STRICT_ALL_TABLES,MySQL返回錯誤並忽視剩余的行。但是,在這種情況下,前面的行已經被插入或更新。這說明你可以部分更新,這可能不是你想要的。要避免這點,最好使用單行語句,因為這樣可以不更改表即可以放棄。   · 對於STRICT_TRANS_TABLES,MySQL將非法值轉換為最接近該列的合法值並插入調整後的值。如果值丟失,MySQL在列中插入隱式默認值。在任何情況下,MySQL都會生成警告而不是給出錯誤並繼續執行語句。描述了隱式默認值。   嚴格模式不允許非法日期,例如’2004-04-31′。它不允許禁止日期使用“零”部分,例如’2004-04-00′或“零”日期。要想禁止,應在嚴格模式基礎上,啟用NO_ZERO_IN_DATE和NO_ZERO_DATE SQL模式。   www.2cto.com   如果你不使用嚴格模式(即不啟用STRICT_TRANS_TABLES或STRICT_ALL_TABLES模式),對於非法或丟失的值,MySQL將插入調整後的值並給出警告。在嚴格模式,你可以通過INSERT IGNORE或UPDATE IGNORE來實現。   下面的特殊模式快速組合了前面所列的模式。   其中包括大多數最新版本MySQL中的所有模式值。舊版本中,組合模式不包括新版本中沒有的不適用的具體模式值。   等同REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE。   · DB2   等同PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS。   · MAXDB   等同PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、 NO_AUTO_CREATE_USER。   · MSSQL   等同PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS。   · MYSQL323   等同NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE。   · MYSQL40   www.2cto.com   等同NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE。   · ORACLE   等同PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER。   · POSTGRESQL   等同PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS。   · TRADITIONAL   等同STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER   (二)sql 代碼 1.select @@sql_mode;  2.  3.CREATE TABLE `t` (  4. `name` varchar(20),  5. `email` varchar(40)  6.);   www.2cto.com   7.desc t;  8.  9.set session sql_mode="REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI";  10.  11.insert into t(`name`, `email`) values("12345678901234567890999999", "[email protected]");  12.  13.set session sql_mode="STRICT_TRANS_TABLES";      本文來自於知行網

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