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

歡迎訪問 生活随笔!

生活随笔

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

数据库

division mysql_三、被 MySQL sql_mode 深深伤害( 上 )

發(fā)布時間:2024/3/26 数据库 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 division mysql_三、被 MySQL sql_mode 深深伤害( 上 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

常在海邊走,哪有不濕鞋,用 MySQL 多了,就常常會遇見各種錯誤,尤其是不同版本帶來的錯誤。

而經(jīng)常刺痛我們的,應該數(shù) MySQL 的 sql_mode 了,比如在 記不住的 MySQL DISTINCT 的用法 ( 上 ) 的示例數(shù)據(jù)下執(zhí)行下面的語句會報錯

mysql> SELECT DISTINCT(user),fruit FROM fruits GROUP BY user,fruit;

ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.fruits.fruit' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

這個錯誤的意思是說,在 sql_mode=only_full_group_by 模式下,所選取的字段,必須出現(xiàn)在 GROUP BY 子句中。

這種要求其實也很好理解,如果選取的列不在 GROUP BY 子句中,那么它的值就是隨機的,沒啥大意義。

還有另一種情況的 sql_mode 錯誤,就是在 5.7 以上的版本中,timestamp 類型的默認值不能全為 0 ,及 0000-00-00 00:00:00

比如,執(zhí)行下面的語句會報錯

mysql> CREATE TABLE `test`.`user` (

`id` int AUTO_INCREMENT,

`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',

PRIMARY KEY (`id`)

);

ERROR 1067 (42000): Invalid default value for 'created_at'

出現(xiàn)這個問題的原因,是因為 sql_mode 包含了 NO_ZERO_IN_DATE 和 NO_ZERO_DATE,而在這兩個模式下,timestamp 的年份只能是 1970-2038,對了,上限在某些機子上已經(jīng)不是 2038 了

字符這個錯誤的辦法很簡單,就是把 timestamp 類型的默認值改成 1970-01-01 00:00:00

mysql> CREATE TABLE `test`.`user` (

-> `id` int AUTO_INCREMENT,

-> `created_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',

-> PRIMARY KEY (`id`)

-> );

Query OK, 0 rows affected (0.10 sec)

這很反直覺,但很有效,只不過在判斷 timestamp 是否為空的時候,可能就要判斷是否等于 `1970-01-01 00:00:00

還有很多很多 sql_mode 引起的錯誤,小編一時就想不起來了

sql_mode 是什么 ?

屢屢受 sql_mode 欺負,那么它到底是什么 ?

官網(wǎng)對此的解釋是 「 Modes affect the SQL syntax MySQL supports and the data validation checks it performs 」

翻譯成中文就是 「 模式會影響 MySQL 支持的 SQL 語法以及它執(zhí)行的數(shù)據(jù)驗證檢查 」

白話一點就是 sql_mode 決定了哪些 SQL 語句可以被執(zhí)行,哪些不能被執(zhí)行

MySQL 查看 sql_mode

其實,官方還有一段話

The MySQL server can operate in different SQL modes, and can apply these modes differently for different clients, depending on the value of the sql_mode system variable. DBAs can set the global SQL mode to match site server operating requirements, and each application can set its session SQL mode to its own requirements

這句話的意思是說

「 MySQL 服務器可以在不同的 SQL 模式下運行,并且可以針對不同的客戶端以不同的方式應用這些模式,具體取決于 sql_mode 系統(tǒng)變量的值 」。

那你肯定和我一樣好奇,就是當前連接的 sql_mode 到底是什么 ?

好在 MySQL 提供了一些命令用于查詢和設置 sql_mode,我們可以使用下面的命令查看當前 MySQL 連接的 sql_mode

mysql> select @@sql_mode;

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

| @@sql_mode |

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

| ONLY_FULL_GROUP_BY,

|STRICT_TRANS_TABLES,

|NO_ZERO_IN_DATE,

|NO_ZERO_DATE,

|ERROR_FOR_DIVISION_BY_ZERO,

|NO_AUTO_CREATE_USER,

|NO_ENGINE_SUBSTITUTION |

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

1 row in set (0.00 sec)

(我對結果進行了換行)

是不是看到了熟悉的身影,其實 sql_mode 遠遠不止這些值。我們暫時只對常見的幾個值做下解釋吧

1、 ONLY_FULL_GROUP_BY

對于 `GROUP BY` 聚合操作,如果 `SELECT中` 的列,沒有在 `GROUP BY` 中出現(xiàn),那么將認為這個 SQL 是不合法的

2、 STRICT_TRANS_TABLES

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

3、 NO_ZERO_IN_DATE

在嚴格模式,不接受月或日部分為0的日期。

如果使用 `IGNORE` 選項或非嚴格模式,則可以插入類似的日期 '0000-00-00',但會生成警告

4、 NO_ZERO_DATE

在嚴格模式,不要將 '0000-00-00' 做為合法日期

如果使用 `IGNORE` 選項或非嚴格模式,則可以插入類似的日期 '0000-00-00',但會生成警告

5、 ERROR_FOR_DIVISION_BY_ZERO

嚴格模式下,在 `INSERT` 或 `UPDATE` 過程中,如果除零(或 `MOD(X,0)` ),則產(chǎn)生錯誤(否則為警告)

如果未給出該模式,除零時MySQL返回 `NULL`

如果設置了 `INSERT IGNORE` 或 `UPDATE IGNORE` 中,MySQL 則生成除零警告,但操作結果為 `NULL`

6、 NO_AUTO_CREATE_USER

防止 `GRANT` 自動創(chuàng)建新用戶

但如果通知指定了密碼,則有可能會創(chuàng)建新用戶

7、 NO_ENGINE_SUBSTITUTION:

如果需要的存儲引擎被禁用或未編譯,那么拋出錯誤

不設置此值時,會默認的存儲引擎替代,并拋出一個異常

干貨推薦

附錄:MySQL 拾遺:系列文章

總結

以上是生活随笔為你收集整理的division mysql_三、被 MySQL sql_mode 深深伤害( 上 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 免费视频网站www | 操你啦影院| 日本伦理片在线看 | 午夜精品久久久久久久久久蜜桃 | 亚洲欧美另类中文字幕 | 已满十八岁免费观看 | 国产美女av在线 | 亚洲成人tv| 三上悠亚三级 | www.欧美在线 | 国产精品毛片久久久久久 | 亚洲午夜精品久久久久久app | 国产日韩精品一区二区三区 | 91看片网 | 亚洲美女自拍偷拍 | 久久国产乱子伦免费精品 | 欧美性高潮 | 亚洲论理| 秋霞影院午夜丰满少妇在线视频 | 久久精品国产99国产精品 | 91porn破解版 | 亚洲激情视频网站 | 一区二区三区网站 | 日韩中文字幕久久 | 色窝网| 亚洲性影院 | 日日碰日日操 | 成人av在线网站 | 国产欧美中文字幕 | 国产亚洲精品美女久久久 | 超碰97色| 亚洲欧洲视频 | 国产午夜大地久久 | 亚洲女人初尝黑人巨大 | 欧洲成人一区二区三区 | 在线免费黄色网址 | 午夜免费福利在线 | av在线资源播放 | 91日批| 黑料av在线 | 国产永久在线观看 | 激情综合av| 小香蕉av | 日本不卡视频一区二区 | 大肉大捧一进一出好爽视频动漫 | 推特裸体gay猛交gay | 亚洲第一精品在线 | 国产呦小j女精品视频 | 午夜天堂视频 | 精品一区二区三区av | 精品在线视频观看 | 亚洲品质自拍视频 | 草草影院第一页yycc.com | 亚洲com| 成人免费高清 | 成人性生交大免费看 | 国产激情网站 | 欧美精品hd | 免费视频久久 | 久一区二区三区 | v天堂在线观看 | 污视频网站在线观看 | 日本a v网站 | 黄色一级小说 | 日韩一级黄色片 | 日韩欧美在线观看 | 日韩福利一区二区三区 | 亚洲精品国产精品乱码不卡√香蕉 | 体感预报日剧 | 欧美乱妇狂野欧美视频 | 狠狠操伊人 | 美女免费福利视频 | 欧美成人国产精品高潮 | 精品人妻一区二区三区蜜桃 | av片免费 | 日韩三级免费看 | av免费看网站 | 一区二区欧美在线 | 免费一区二区在线观看 | 亚洲欧美另类在线观看 | 超碰不卡 | 亚洲福利专区 | 99精品热视频 | 综合激情婷婷 | 91精品国产自产91精品 | av中文字幕网址 | 视色影院 | 日本在线中文字幕专区 | 国语对白做受按摩的注意事项 | 国产三级视频在线 | 亚洲图片在线观看 | 啪啪导航 | 永久免费精品 | 欧美日韩在线观看一区二区三区 | 高清国产一区二区 | 九色porny自拍 | 一级做a爰片久久毛片 | 神秘马戏团在线观看免费高清中文 | 免费污视频在线观看 |