您好,登錄后才能下訂單哦!
專題描述 | 詳細描述SQL_MODE為嚴格模式下可能出現的數據錯誤風險。 | ||||
問題提出 | 1 | 日期默認'0000-00-00 00:00:00'的,查詢時會直接報錯。 Caused by: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp URL需添加如下參數:zeroDateTimeBehavior=convertToNull。 | |||
2 | OMS數據庫因UAT環境和性能測試環境的參數配置不同,導致性能測試環境下應用SQL執行報錯,相關參數為STRICT_TRANS_TABLES與explicit_defaults_for_timestamp。 | ||||
數據風險 | 1 | 整型類型數據值截斷風險 | 重點關注 TINYINT類型 ,其他整數類型上線初期溢出概率低。 以“`payment_display_mode` tinyint(4) DEFAULT NULL COMMENT '付款到期日顯示方式: 11-最晚匯款日 12-到期日',” 為例。 示例:在非嚴格模式下,應用程序為 字段 payment_display_mode 設置一個值 小于-128 或大于127 , 則超過部分會被截斷(超過-128,則存儲為-128,例如 -200 會默認變成 -128;超過127,則存儲為127),例如 300 會默認變成127。 | ||
2 | 浮點類型截斷 | 以“`longitude` DECIMAL(19,5) NULL DEFAULT '0.00000' COMMENT '經度坐標'” 為例。 示例:在非嚴格模式下,應用程序為 字段 longitude 設置一個值 超過 5位小數或者整數超過14位, 則超過部分會被截斷。 | |||
3 | 字符串類型風險 | 以“`MODIFIER_USER` VARCHAR(30) NUL L DEFAULT NULL COMMENT '更新者用戶賬號',” 為例。 示例:在非嚴格模式下, 應用程序為 字段 MODIFIER_USER 設置一個值 超過 30個字符,則超過部分會被截斷。 | |||
4 | 時間類型風險 | 由于JAVA代碼認為0000-00-00 00:00:00時間是非法的時間,JDBC中提供參數控制對它的處理, 故可通過添加zeroDateTimeBehavior=convertToNull使其轉化為null。 連接字符串示例: jdbc:mysql://10.202.198.201:3319/oms6?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull | |||
5 | NOT NULL類型風險 | 非嚴格模式下,不給字段定義約束 NOT NULL字段賦值 或 給其一個NULL值, 在無定義約束無默認值的情況下:數據值類型的 字段值默認為0,字符串類型的字段值默認為空字符串''。從SQL語句和存儲過程處理分析,多數情況下都兼容處理了,但依然請研發團隊謹慎評估。 | |||
問題原因 | 數據庫SQL_MODE設置為嚴格模式。 | ||||
解決方案 | 1 | 建議DBA團隊設置SQL_MODE為嚴格模式,運行系統進行測試,將根據報錯定位存在的數據隱患,修改程序。 | |||
2 | 設置服務器SQL_MODE為嚴格模式。 | ||||
知識點 | 1 | 數據庫SQL_MODE設置為嚴格模式將出現問題分為以下幾類 :1、日期默認'0000-00-00 00:00:00'的;查詢時會直接報錯, 2、字段類型設置為NOT NULL時,插入NULL值將報錯; 3、當插入超出數值字段類型范圍的值時,直接報錯; | |||
2 | STRICT_TRANS_TABLES釋義: 官方文檔鏈接: http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-strict 官方文檔解釋:For transactional tables, an error occurs for invalid or missing values in a data-change statement when either STRICT_ALL_TABLES or STRICT_TRANS_TABLES is enabled. The statement is aborted and rolled back.使用該參數的主要目的還是使得數據庫面對錯誤的數據和操作時傾向于報錯,而不是給出警告。便于提早發現問題,與規范對數據庫的操作。 | ||||
3 | 數據庫SQL_MODE設置為非嚴格模式時,系統上述情況傾向于警告 。插入超過數值類型范圍字段值時系統取最大值插入, 插入字符類型字段值超過長度范圍時會截斷。 |
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。