MySQL5.6測試
MySQL的版本
查看一下sel_mode
創建數據庫及表
創建一個test數據庫,里面有一張userinfo表:
birthday這個字段可以為空 —— MySQL中datetime類型的數據默認的空值為NULL,不是空字符串!
往里面寫入一些數據:
使用原生SQL修改里面的數據
use test; update userinfo set birthday="2012-01-03" where name="whw"; select name,age,birthday from userinfo where name="whw";
結果如下:
使用pymysql往數據庫中插入datetime類型的數據(注意空數據的寫法)
import pymysql #連接數據庫 —— 注意這里password得寫成字符串類型!!! conn = pymysql.connect(host='localhost',port=3306,user='root',password='123',database='test',charset='utf8') #獲取光標對象 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #返回的是一個含有多個字典的列表 #添加數據 try: sql1 = "insert into userinfo(name,age,birthday) values(%s,%s,%s)" # 支持字符串類型的日期數插入數據庫的datetime類型的字段 cursor.execute(sql1,["wanghw",3,"2017-09-09"]) # 如果插入datetime類型的數據為空的話,格式是(None) sql2 = "insert into userinfo(name,age,birthday) values(%s,%s,%s)" cursor.execute(sql2,["whh",5,(None)]) except Exception as e: # 回滾 conn.rollback()
cursor.close()
conn.close() print(f"事物執行失敗{e}") else: conn.commit()
cursor.close()
conn.close() print(f"事物執行成功!}")
結果如下:
MySQL5.6的group by查詢
我們使用group by查詢一下里面的數據 —— 注意select后面的name字段既沒放在聚合函數中也不是group by的字段!
MySQL5.7的sql_mode=only_full_group_by的一個問題
由於本地測試機的MySQL的版本是5.6的,5.7版本在別的地方測試一下。
這回我們來看一下MySQL5.7版本的sql_mode:
可以看到:MySQL5.7版本默認情況下設置了多項sql_mode,我們今天來看一下ONLY_FULL_GROUP_BY這個的影響。
然后我們在MySQL5.7中測試一下既不在聚合函數中也不是分組字段的group by的查詢:
可以看到,在MySQL5.7下這樣的查詢報錯了,原因就是MySQL5.7默認設置了:sql_mode=only_full_group_by。
意思是:
對於GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那么這個SQL是不合法的,因為列不在GROUP BY從句中,也就是說查出來的列必須在group by后面出現否則就會報錯,或者這個字段出現在聚合函數里面。
我們把上面的loginname加在聚合函數里面就好了:
解決的方法可以參考下面這幾篇博客:
https://blog.csdn.net/yalishadaa/article/details/72861737
https://blog.csdn.net/weixin_43064185/article/details/99646535