溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MYSQL 中STRICT_TRANS_TABLES如何使用

發(fā)布時(shí)間:2021-08-13 17:07:59 來源:億速云 閱讀:503 作者:Leah 欄目:數(shù)據(jù)庫(kù)

MYSQL 中STRICT_TRANS_TABLES如何使用,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

MYSQL STRICT_TRANS_TABLES使用圖解教程
 
mysql 在insert的時(shí)候,常常提示沒有默認(rèn)值,MySQL 1364 錯(cuò)誤提示:#1364 - Field "XXX" doesn't have a default value。XXX字段沒有默認(rèn)的數(shù)值;也就是說我們沒有為其分配數(shù)值,而表中此字段也沒有設(shè)置默認(rèn)值。這是mysql模式開啟存儲(chǔ)引擎啟用嚴(yán)格模式,非法數(shù)據(jù)值被拒絕, 我把操作實(shí)際問題貼一下圖:

 
而我的Tbl_User表里面字段:
   www.2cto.com  

 
解決方法:就是在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" 
 
把嚴(yán)格模式去掉,得啟mysql即可
 
貼一下網(wǎng)上有關(guān)模式詳細(xì)介紹:
NO_AUTO_CREATE_USER
  www.2cto.com  
防止GRANT自動(dòng)創(chuàng)建新用戶,除非還指定了密碼。
NO_UNSIGNED_SUBTRACTION 
在減運(yùn)算中,如果某個(gè)操作數(shù)沒有符號(hào),不要將結(jié)果標(biāo)記為UNSIGNED。請(qǐng)注意這樣使UNSIGNED BIGINT不能100%用于上下文中。
 
再貼一下其它幾種模式:
在mysql 5中,默認(rèn)的是REAL_AS_FLOAT,PIPES_AS_CONTACT,ANSI_QUOTES,GNORE_SPACE和ANSI,
在這種模式下,允許插入超過字段長(zhǎng)度的值,只是插入后,返回的是警告而不是錯(cuò)誤,當(dāng)用STRICT_TRANS_TABLES時(shí),
則是錯(cuò)誤了,嚴(yán)格的警告.
 
NO_AUTO_CREATE_USER
 
防止GRANT自動(dòng)創(chuàng)建新用戶,除非還指定了密碼。
下面是手冊(cè)中的一些介紹
 
下面描述了支持的所有模式:
· ALLOW_INVALID_DATES
 
在嚴(yán)格模式下不要檢查全部日期。只檢查1到12之間的月份和1到31之間的 日。這在Web應(yīng)用程序中,當(dāng)你從三個(gè)不同的字段獲取年、月、日,并且想要確切保存用戶插入的內(nèi)容(不進(jìn)行日期驗(yàn)證)時(shí)很重要。該模式適用于DATE和 DATETIME列。不適合TIMESTAMP列,TIMESTAMP列需要驗(yàn)證日期。
 
啟用嚴(yán)格模式后,服務(wù)器需要合法的月和日,不僅僅是分別在1到12和1到31范圍內(nèi)。例如,禁用嚴(yán)格模式時(shí)’2004-04-31′是合法的,但啟用嚴(yán)格模式后是非法的。要想在嚴(yán)格模式允許遮掩固定日期,還應(yīng)啟用ALLOW_INVALID_DATES。
  www.2cto.com  
· ANSI_QUOTES
 
將‘”’視為識(shí)別符引號(hào)(‘`’引號(hào)字符),不要視為字符串的引號(hào)字符。在ANSI模式,你可以仍然使用‘`’來引用識(shí)別符。啟用ANSI_QUOTES后,你不能用雙引號(hào)來引用字符串,因?yàn)樗唤忉尀樽R(shí)別符。
 
· ERROR_FOR_DIVISION_BY_ZERO
 
在嚴(yán)格模式,在INSERT或UPDATE過程中,如果被零除(或 MOD(X,0)),則產(chǎn)生錯(cuò)誤(否則為警告)。如果未給出該模式,被零除時(shí)MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作結(jié)果為NULL。
 
· HIGH_NOT_PRECEDENCE
 
NOT 操作符的優(yōu)先順序是表達(dá)式例如NOT a BETWEEN b AND c被解釋為NOT (a BETWEEN b AND c)。在一些舊版本MySQL中, 表達(dá)式被解釋為(NOT a) BETWEEN b AND c。啟用HIGH_NOT_PRECEDENCESQL模式,可以獲得以前的更高優(yōu)先級(jí)的結(jié)果。
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
 
允許函數(shù)名和‘(’之間有空格。強(qiáng)制將所有函數(shù)名視為保存的字。結(jié)果是,如果你想要訪問保存為字的、表或列名,你必須引用它。例如,因?yàn)橛蠻SER()函數(shù),數(shù)據(jù)庫(kù)中的user表名和該表內(nèi)的User列被保存下來,因此你必須引用它們:
SELECT "User" FROM mysql."user"; 
· NO_AUTO_CREATE_USER
 
防止GRANT自動(dòng)創(chuàng)建新用戶,除非還指定了密碼。
  www.2cto.com  
· NO_AUTO_VALUE_ON_ZERO
NO_AUTO_VALUE_ON_ZERO影響AUTO_INCREMENT列的處理。一般情況,你可以向該列插入NULL或0生成下一個(gè)序列號(hào)。NO_AUTO_VALUE_ON_ZERO禁用0,因此只有NULL可以生成下一個(gè)序列號(hào)。
 
如果將0保存到表的AUTO_INCREMENT列,該模式會(huì)很有用。(不推薦采用該慣例)。例如,如果你用mysqldump轉(zhuǎn)儲(chǔ)表并重載,MySQL遇到0值一般會(huì)生成新的序列號(hào),生成的表的內(nèi)容與轉(zhuǎn)儲(chǔ)的表不同。重載轉(zhuǎn)儲(chǔ)文件前啟用NO_AUTO_VALUE_ON_ZERO可以解決該問題。mysqldump在輸出中自動(dòng)包括啟用NO_AUTO_VALUE_ON_ZERO的語句。
 
· NO_BACKSLASH_ESCAPES
禁用反斜線字符(‘’)做為字符串內(nèi)的退出字符。啟用該模式,反斜線則成為普通字符。
 
· NO_DIR_IN_CREATE
創(chuàng)建表時(shí),忽視所有INDEX DIRECTORY和DATA DIRECTORY指令。該選項(xiàng)對(duì)從復(fù)制服務(wù)器有用。
 
· NO_ENGINE_SUBSTITUTION
如果需要的存儲(chǔ)引擎被禁用或未編譯,可以防止自動(dòng)替換存儲(chǔ)引擎。
 
· NO_FIELD_OPTIONS
不要在SHOW CREATE TABLE的輸出中打印MySQL專用列選項(xiàng)。該模式在可移植模式(portability mode)下用于mysqldump。
 
· NO_KEY_OPTIONS
 
不要在SHOW CREATE TABLE的輸出中打印MySQL專用索引選項(xiàng)。該模式在可移植模式(portability mode)下用于mysqldump。
 
· NO_TABLE_OPTIONS
  www.2cto.com  
不要在SHOW CREATE TABLE的輸出中打印MySQL專用表選項(xiàng)(例如ENGINE)。該模式在可移植模式(portability mode)下用于mysqldump。
 
· NO_UNSIGNED_SUBTRACTION
 
在減運(yùn)算中,如果某個(gè)操作數(shù)沒有符號(hào),不要將結(jié)果標(biāo)記為UNSIGNED。請(qǐng)注意這樣使UNSIGNED BIGINT不能100%用于上下文中。 · NO_ZERO_DATE
 
在嚴(yán)格模式,不要將 ‘0000-00-00′做為合法日期。你仍然可以用IGNORE選項(xiàng)插入零日期。在非嚴(yán)格模式,可以接受該日期,但會(huì)生成警告。
 
· NO_ZERO_IN_DATE
 
在嚴(yán)格模式,不接受月或日部分為0的日期。如果使用IGNORE選項(xiàng),我們?yōu)轭愃频娜掌诓迦?amp;rsquo;0000-00-00′。在非嚴(yán)格模式,可以接受該日期,但會(huì)生成警告。
 
· ONLY_FULL_GROUP_BY
 
不要讓GROUP BY部分中的查詢指向未選擇的列。
 
· PIPES_AS_CONCAT
 
將||視為字符串連接操作符(+)(同CONCAT()),而不視為OR。
 
· REAL_AS_FLOAT
 
將REAL視為FLOAT的同義詞,而不是DOUBLE的同義詞。
 
· STRICT_TRANS_TABLES
 
為所有存儲(chǔ)引擎啟用嚴(yán)格模式。非法數(shù)據(jù)值被拒絕。
 
· STRICT_TRANS_TABLES
 
為事務(wù)存儲(chǔ)引擎啟用嚴(yán)格模式,也可能為非事務(wù)存儲(chǔ)引擎啟用嚴(yán)格模式。后面有詳細(xì)說明。
 
嚴(yán)格模式控制MySQL如何處理非法或丟失的輸入值。有幾種原因可以使一個(gè)值為非法。例如,數(shù)據(jù)類型錯(cuò)誤,不適合列,或超出范圍。當(dāng)新插入的行不包含某列的沒有顯示定義DEFAULT子句的值,則該值被丟失。  www.2cto.com  
 
對(duì)于事務(wù)表,當(dāng)啟用STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式時(shí),如果語句中有非法或丟失值,則會(huì)出現(xiàn)錯(cuò)誤。語句被放棄并滾動(dòng)。
 
對(duì)于非事務(wù)表,如果插入或更新的第1行出現(xiàn)壞值,兩種模式的行為相同。語句被放棄,表保持不變。如果語句插入或修改多行,并且壞值出現(xiàn)在第2或后面的行,結(jié)果取決于啟用了哪個(gè)嚴(yán)格選項(xiàng):
 
· 對(duì)于STRICT_ALL_TABLES,MySQL返回錯(cuò)誤并忽視剩余的行。但是,在這種情況下,前面的行已經(jīng)被插入或更新。這說明你可以部分更新,這可能不是你想要的。要避免這點(diǎn),最好使用單行語句,因?yàn)檫@樣可以不更改表即可以放棄。
 
· 對(duì)于STRICT_TRANS_TABLES,MySQL將非法值轉(zhuǎn)換為最接近該列的合法值并插入調(diào)整后的值。如果值丟失,MySQL在列中插入隱式默認(rèn)值。在任何情況下,MySQL都會(huì)生成警告而不是給出錯(cuò)誤并繼續(xù)執(zhí)行語句。描述了隱式默認(rèn)值。
 
嚴(yán)格模式不允許非法日期,例如’2004-04-31′。它不允許禁止日期使用“零”部分,例如’2004-04-00′或“零”日期。要想禁止,應(yīng)在嚴(yán)格模式基礎(chǔ)上,啟用NO_ZERO_IN_DATE和NO_ZERO_DATE SQL模式。
  www.2cto.com  
如果你不使用嚴(yán)格模式(即不啟用STRICT_TRANS_TABLES或STRICT_ALL_TABLES模式),對(duì)于非法或丟失的值,MySQL將插入調(diào)整后的值并給出警告。在嚴(yán)格模式,你可以通過INSERT IGNORE或UPDATE IGNORE來實(shí)現(xiàn)。
 
下面的特殊模式快速組合了前面所列的模式。
 
其中包括大多數(shù)最新版本MySQL中的所有模式值。舊版本中,組合模式不包括新版本中沒有的不適用的具體模式值。
 
等同REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE。
 
·
 
等同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", "beijing2008@126.com"); 
12. 
13.set session sql_mode="STRICT_TRANS_TABLES"; 

看完上述內(nèi)容,你們掌握MYSQL 中STRICT_TRANS_TABLES如何使用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI