最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于MySQL的sql_mode合理設(shè)置詳解

 更新時(shí)間:2019年07月28日 09:17:42   作者:小馬哥888  
這篇文章主要給大家介紹了關(guān)于MySQL的sql_mode合理設(shè)置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

MySQL的sql_mode合理設(shè)置

sql_mode是個(gè)很容易被忽視的變量,默認(rèn)值是空值,在這種設(shè)置下是可以允許一些非法操作的,比如允許一些非法數(shù)據(jù)的插入。在生產(chǎn)環(huán)境必須將這個(gè)值設(shè)置為嚴(yán)格模式,所以開發(fā)、測(cè)試環(huán)境的數(shù)據(jù)庫也必須要設(shè)置,這樣在開發(fā)測(cè)試階段就可以發(fā)現(xiàn)問題.

1.sql model 常用來解決下面幾類問題:

  (1) 通過設(shè)置sql mode, 可以完成不同嚴(yán)格程度的數(shù)據(jù)校驗(yàn),有效地保障數(shù)據(jù)準(zhǔn)備性。

  (2) 通過設(shè)置sql model 為寬松模式,來保證大多數(shù)sql符合標(biāo)準(zhǔn)的sql語法,這樣應(yīng)用在不同數(shù)據(jù)庫之間進(jìn)行遷移時(shí),則不需要對(duì)業(yè)務(wù)sql 進(jìn)行較大的修改。

  (3) 在不同數(shù)據(jù)庫之間進(jìn)行數(shù)據(jù)遷移之前,通過設(shè)置SQL Mode 可以使MySQL 上的數(shù)據(jù)更方便地遷移到目標(biāo)數(shù)據(jù)庫中。

2.sql_mode常用值如下:

    1. ONLY_FULL_GROUP_BY:

       對(duì)于GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現(xiàn),那么這個(gè)SQL是不合法的,因?yàn)榱胁辉贕ROUP BY從句中。

   2. NO_AUTO_VALUE_ON_ZERO:

      該值影響自增長(zhǎng)列的插入。默認(rèn)設(shè)置下,插入0或NULL代表生成下一個(gè)自增長(zhǎng)值。如果用戶希望插入的值為0,而該列又是自增長(zhǎng)的,那么這個(gè)選項(xiàng)就有用了。

   3. STRICT_TRANS_TABLES:嚴(yán)格模式

      在該模式下,如果一個(gè)值不能插入到一個(gè)事務(wù)表中,則中斷當(dāng)前的操作,對(duì)非事務(wù)表不做限制。

   4. NO_ZERO_IN_DATE:

      在嚴(yán)格模式下,不允許日期和月份為零。
 
   5. NO_ZERO_DATE:

      設(shè)置該值,mysql數(shù)據(jù)庫不允許插入零日期,插入零日期會(huì)拋出錯(cuò)誤而不是警告。
 
   6. ERROR_FOR_DIVISION_BY_ZERO:

      在INSERT或UPDATE過程中,如果數(shù)據(jù)被零除,則產(chǎn)生錯(cuò)誤而非警告。如果未給出該模式,那么數(shù)據(jù)被零除時(shí)MySQL返回NULL
 
   7. NO_AUTO_CREATE_USER:

      禁止GRANT創(chuàng)建密碼為空的用戶

   8. NO_ENGINE_SUBSTITUTION:

      如果需要的存儲(chǔ)引擎被禁用或未編譯,那么拋出錯(cuò)誤。不設(shè)置此值時(shí),用默認(rèn)的存儲(chǔ)引擎替代,并拋出一個(gè)異常

   9. PIPES_AS_CONCAT:

      將"||"視為字符串的連接操作符而非或運(yùn)算符,這和Oracle數(shù)據(jù)庫是一樣的,也和字符串的拼接函數(shù)Concat相類似

   10. ANSI_QUOTES:

      啟用ANSI_QUOTES后,不能用雙引號(hào)來引用字符串,因?yàn)樗唤忉尀樽R(shí)別符

    ORACLE的sql_mode設(shè)置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.

    如果使用mysql,為了繼續(xù)保留大家使用oracle的習(xí)慣,可以對(duì)mysql的sql_mode設(shè)置如下:

    在my.cnf添加如下配置

    [mysqld]
    sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
    ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,PIPES_AS_CONCAT,ANSI_QUOTES' 

3.寬松模式 和 嚴(yán)格模式 的注意事項(xiàng):

【1】注意:MySQL5.6和MySQL5.7默認(rèn)的sql_mode模式參數(shù)是不一樣的。
    5.6的mode是NO_ENGINE_SUBSTITUTION,其實(shí)表示的是一個(gè)空值,相當(dāng)于沒有什么模式設(shè)置,可以理解為寬松模式。
    5.7的mode是STRICT_TRANS_TABLES,也就是嚴(yán)格模式。
   
【2】如果設(shè)置的是寬松模式,那么我們?cè)诓迦霐?shù)據(jù)的時(shí)候,即便是給了一個(gè)錯(cuò)誤的數(shù)據(jù),也可能會(huì)被接受,并且不報(bào)錯(cuò)。
   
    例如:我在創(chuàng)建一個(gè)表時(shí),該表中有一個(gè)字段為name,給name設(shè)置的字段類型時(shí)char(10),如果我在插入數(shù)據(jù)的時(shí)候,其中name這個(gè)字段對(duì)應(yīng)的有一條數(shù)據(jù)的長(zhǎng)度超過了10,例如'1234567890abc',超過了設(shè)定的字段長(zhǎng)度10,那么不會(huì)報(bào)錯(cuò),并且取前十個(gè)字符存上,也就是說你這個(gè)數(shù)據(jù)被存為了'1234567890',而'abc'就沒有了,但是我們知道,我們給的這條數(shù)據(jù)是錯(cuò)誤的,因?yàn)槌^了字段長(zhǎng)度,但是并沒有報(bào)錯(cuò),并且mysql自行處理并接受了,這就是寬松模式的效果。
   
    其實(shí)在開發(fā)、測(cè)試、生產(chǎn)等環(huán)境中,我們應(yīng)該采用的是嚴(yán)格模式,出現(xiàn)這種錯(cuò)誤,應(yīng)該報(bào)錯(cuò)才對(duì),所以MySQL5.7版本就將sql_mode默認(rèn)值改為了嚴(yán)格模式,并且我們即便是用的MySQL5.6,也應(yīng)該自行將其改為嚴(yán)格模式。
   
    另外,MySQL等等的這些數(shù)據(jù)庫,都是想把關(guān)于數(shù)據(jù)的所有操作都自己包攬下來,包括數(shù)據(jù)的校驗(yàn),其實(shí)好多時(shí)候,我們應(yīng)該在自己開發(fā)的項(xiàng)目程序級(jí)別將這些校驗(yàn)給做了,雖然寫項(xiàng)目的時(shí)候麻煩了一些步驟,但是這樣做之后,我們?cè)谶M(jìn)行數(shù)據(jù)庫遷移或者在項(xiàng)目的遷移時(shí),就會(huì)方便很多。mysql除了數(shù)據(jù)校驗(yàn)之外,你慢慢的學(xué)習(xí)過程中會(huì)發(fā)現(xiàn),它能夠做的事情還有很多很多,將你程序中做的好多事情都包攬了。
   
【3】改為嚴(yán)格模式后可能會(huì)存在的問題:

    若設(shè)置模式中包含了NO_ZERO_DATE,那么MySQL數(shù)據(jù)庫不允許插入零日期,插入零日期會(huì)拋出錯(cuò)誤而不是警告。
    例如:表中含字段TIMESTAMP列(如果未聲明為NULL或顯示DEFAULT子句)將自動(dòng)分配DEFAULT '0000-00-00 00:00:00'(零時(shí)間戳),也或者是本測(cè)試的表day列默認(rèn)允許插入零日期 '0000-00-00' COMMENT '日期';這些顯然是不滿足sql_mode中的NO_ZERO_DATE而報(bào)錯(cuò)。

4.模式設(shè)置和修改(以解決上述問題為例):


【方式一】:

    先執(zhí)行select @@sql_mode,復(fù)制查詢出來的值并將其中的NO_ZERO_IN_DATE,NO_ZERO_DATE刪除,然后執(zhí)行set sql_mode = '修改后的值'或者set session sql_mode='修改后的值';
   
    例如:set session sql_mode='STRICT_TRANS_TABLES';改為嚴(yán)格模式
   
    注意:此方法只在當(dāng)前會(huì)話中生效,關(guān)閉當(dāng)前會(huì)話就不生效了。


【方式二】:
    先執(zhí)行select @@global.sql_mode,復(fù)制查詢出來的值并將其中的NO_ZERO_IN_DATE,NO_ZERO_DATE刪除,然后執(zhí)行set global sql_mode = '修改后的值'。

    注意:此方法在當(dāng)前服務(wù)中生效,重新MySQL服務(wù)后失效
 
【方法三】:
    1.在mysql的安裝目錄下,或my.cnf文件(windows系統(tǒng)是my.ini文件),新增 sql_mode =
    "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    添加my.ini如下:
   
    [mysqld]
   
    sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    2.然后重啟mysql。以管理員身份運(yùn)行CMD,執(zhí)行 net stop mysql ,再執(zhí)行 net start mysql。

    注意:此方法永久生效.當(dāng)然生產(chǎn)環(huán)境上是禁止重啟MySQL服務(wù)的,所以采用‘方式二+方式三'來解決線上的問題,那么即便是有一天真的重啟了MySQL服務(wù),也會(huì)永久生效了。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 完美解決phpstudy安裝后mysql無法啟動(dòng)(無需刪除原數(shù)據(jù)庫,無需更改任何配置,無需更改端口)直接共存

    完美解決phpstudy安裝后mysql無法啟動(dòng)(無需刪除原數(shù)據(jù)庫,無需更改任何配置,無需更改端口)直接共存

    這篇文章主要介紹了完美解決phpstudy安裝后mysql無法啟動(dòng)(無需刪除原數(shù)據(jù)庫,無需更改任何配置,無需更改端口)直接共存 ,需要的朋友可以參考下
    2019-04-04
  • MySQL NDB Cluster關(guān)于Nginx stream的負(fù)載均衡配置方式

    MySQL NDB Cluster關(guān)于Nginx stream的負(fù)載均衡配置方式

    這篇文章主要介紹了MySQL NDB Cluster關(guān)于Nginx stream的負(fù)載均衡配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • MySQL中的引號(hào)和反引號(hào)的區(qū)別與用法詳解

    MySQL中的引號(hào)和反引號(hào)的區(qū)別與用法詳解

    這個(gè)問題是我在學(xué)習(xí)數(shù)據(jù)庫的時(shí)候遇到的一個(gè)問題,我當(dāng)時(shí)并不能理解下圖中的一些情況,后來我也請(qǐng)教了一位大佬給我解答,最后在大佬和度娘的幫助下我大概理解了這個(gè)反引號(hào)的東西
    2021-10-10
  • mysql臨時(shí)變量的使用

    mysql臨時(shí)變量的使用

    這篇文章主要介紹了mysql臨時(shí)變量的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • MYSQL表優(yōu)化方法小結(jié) 講的挺全面

    MYSQL表優(yōu)化方法小結(jié) 講的挺全面

    一篇MYSQL表優(yōu)化的文章,說的很好,使用mysql的朋友可以參考下。
    2010-05-05
  • mysql外連接與內(nèi)連接查詢的不同之處

    mysql外連接與內(nèi)連接查詢的不同之處

    在關(guān)系型數(shù)據(jù)庫中,我們經(jīng)常是把數(shù)據(jù)存儲(chǔ)到多個(gè)相互關(guān)聯(lián)的表中,這些相互關(guān)聯(lián)的表通過指定的列發(fā)生聯(lián)系,下面這篇文章主要給大家介紹了關(guān)于mysql外連接與內(nèi)連接查詢的不同之處,需要的朋友可以參考下
    2021-06-06
  • mysql查看binlog日志的實(shí)現(xiàn)方法

    mysql查看binlog日志的實(shí)現(xiàn)方法

    本文主要介紹了配置和查看MySQL 8.01的binlog日志,包括開啟binlog日志、配置日志格式、查看日志位置和內(nèi)容等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-11-11
  • 關(guān)于MySQL中datetime和timestamp的區(qū)別解析

    關(guān)于MySQL中datetime和timestamp的區(qū)別解析

    在MySQL中一些日期字段的類型選擇為datetime和timestamp,那么對(duì)于這兩種類型不同的應(yīng)用場(chǎng)景是什么呢,這篇文章主要介紹了關(guān)于MySQL中datetime和timestamp的區(qū)別解析,需要的朋友可以參考下
    2023-06-06
  • 詳解GaussDB for MySQL性能優(yōu)化

    詳解GaussDB for MySQL性能優(yōu)化

    GaussDB(for MySQL)數(shù)據(jù)庫在寫入性能上,在業(yè)界同類產(chǎn)品中是最好的,這主要得益于GaussDB(for MySQL)在MySQL內(nèi)核方面的諸多優(yōu)化。其中有一項(xiàng)從“送快遞”得來靈感的優(yōu)化——事務(wù)異步提交,值得我們分析。
    2021-05-05
  • navicat創(chuàng)建MySql定時(shí)任務(wù)的方法詳解

    navicat創(chuàng)建MySql定時(shí)任務(wù)的方法詳解

    這篇文章主要介紹了navicat創(chuàng)建MySql定時(shí)任務(wù)的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評(píng)論

新龙县| 沈丘县| 荣成市| 大余县| 达孜县| 龙陵县| 曲松县| 浮梁县| 无极县| 遂平县| 容城县| 海安县| 龙泉市| 鹤庆县| 昌平区| 都安| 昂仁县| 泌阳县| 垣曲县| 元阳县| 礼泉县| 庆元县| 西畴县| 双牌县| 白玉县| 高碑店市| 安岳县| 吴堡县| 宁远县| 焉耆| 育儿| 潼南县| 越西县| 独山县| 隆子县| 安阳市| 民县| 高淳县| 壶关县| 上虞市| 三台县|