日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL的sql_mode解析与设置

發布時間:2024/4/18 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL的sql_mode解析与设置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考地址:?http://blog.csdn.net/ccccalculator/article/details/70432123

因為在MySQL中使用group by?是總是出現1055的錯誤,這就導致了必須去查看是什么原因了,查詢了相關的資料,現在將筆記記錄下來,以便后面可以參考使用:

sql_mode:簡而言之就是:它定義了你MySQL應該支持的sql語法,對數據的校驗等等

select @@sql_mode:使用該命令我們可以查看我們當前數據庫的sql_mode

+ View Code

下面我們來看看sql_mode的各個值的含義:

ONLY_FULL_GROUP_BY:

對于GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那么將認為這個SQL是不合法的,因為列不在GROUP BY從句中

因為有only_full_group_by,所以我們要在MySQL中正確的使用group by語句的話,只能是select column1 from tb1 group by column1(即只能展示group by的字段,其他均都要報1055的錯)

實例:

+ View Code

1

2

3

4

5

6

7

8

9

10

11

12

13

14

mysql> select * from tt1;

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

| id | name? | gender |

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

|? 1 | xiong |????? 0 |

|? 2 | ying? |????? 0 |

|? 3 | cai?? |????? 0 |

|? 4 | zhang |????? 0 |

|? 5 | li??? |????? 1 |

|? 6 | wang? |????? 1 |

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

6 rows in set (0.00 sec)

mysql> select * from tt1 group by name;

ERROR 1055 (42000):

+ View Code

所以我們要使用能正確的使用group by?的話就必須刪除掉only_full_group_by

set sql_mode=(select replace(@@sql_mode,'ONLY_FULL_GROUP_BY',''));?可以使用該語句來將空格替換掉only_full_group_by,這樣我們就可以使用

+ View Code

+ View Code

但是這種方法只是做了暫時的修改,我們可以更改配置文件my.ini

sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

STRICT_TRANS_TABLES:

?在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做任何限制

NO_ZERO_IN_DATE:

?在嚴格模式,不接受月或日部分為0的日期。如果使用IGNORE選項,我們為類似的日期插入'0000-00-00'。在非嚴格模式,可以接受該日期,但會生成警告。

NO_ZERO_DATE:

在嚴格模式,不要將 '0000-00-00'做為合法日期。你仍然可以用IGNORE選項插入零日期。在非嚴格模式,可以接受該日期,但會生成警告

ERROR_FOR_DIVISION_BY_ZERO:

在嚴格模式,在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則產生錯誤(否則為警告)。如果未給出該模式,被零除時MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作結果為NULL

NO_AUTO_CREATE_USER:

防止GRANT自動創建新用戶,除非還指定了密碼。

NO_ENGINE_SUBSTITUTION:

如果需要的存儲引擎被禁用或未編譯,那么拋出錯誤。不設置此值時,用默認的存儲引擎替代,并拋出一個異常

?

三、據說是MySQL5.0以上版本支持三種sql_mode模式:ANSI、TRADITIONAL和STRICT_TRANS_TABLES。?

1、ANSI模式:寬松模式,更改語法和行為,使其更符合標準SQL。對插入數據進行校驗,如果不符合定義類型或長度,對數據類型調整或截斷保存,報warning警告。對于本文開頭中提到的錯誤,可以先把sql_mode設置為ANSI模式,這樣便可以插入數據,而對于除數為0的結果的字段值,數據庫將會用NULL值代替。

將當前數據庫模式設置為ANSI模式:

?mysql>?set?@@sql_mode=ANSI;??

2、TRADITIONAL模式:嚴格模式,當向mysql數據庫插入數據時,進行數據的嚴格校驗,保證錯誤數據不能插入,報error錯誤,而不僅僅是警告。用于事物時,會進行事物的回滾。?注釋:一旦發現錯誤立即放棄INSERT/UPDATE。如果你使用非事務存儲引擎,這種方式不是你想要的,因為出現錯誤前進行的數據更改不會“滾動”,結果是更新“只進行了一部分”。

將當前數據庫模式設置為TRADITIONAL模式:

?

  • mysql>?set?@@sql_mode=TRADITIONAL;? ?
  • 3、STRICT_TRANS_TABLES模式:嚴格模式,進行數據的嚴格校驗,錯誤數據不能插入,報error錯誤。如果不能將給定的值插入到事務表中,則放棄該語句。對于非事務表,如果值出現在單行語句或多行語句的第1行,則放棄該語句。

    將當前數據庫模式設置為STRICT_TRANS_TABLES模式:

    ?

  • mysql>?set?@@sql_mode=STRICT_TRANS_TABLES;??
  • 沒有最好與最壞的模式,只有最合適的模式。需要根據自己的實際情況去選擇那個最適合的模式!!!

    另外說一點,這里的更改數據庫模式都是session級別的,一次性,關了再開就不算數了!!!

    也可以通過配置文件設置:vim /etc/my.cnf
    在my.cnf(my.ini)添加如下配置:
    [mysqld]
    sql_mode='你想要的模式'

    總結

    以上是生活随笔為你收集整理的MySQL的sql_mode解析与设置的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。