1. 程式人生 > >mysql 開發基礎系列22 SQL Model

mysql 開發基礎系列22 SQL Model

block ESS 只需要 角色 res 行遷移 常用 開發 http

一.概述

  與其它數據庫不同,mysql 可以運行不同的sql model 下, sql model 定義了mysql應用支持的sql語法,數據校驗等,這樣更容易在不同的環境中使用mysql。
  sql model 常用來解決下面幾類問題

  (1) 通過設置sql mode, 可以完成不同嚴格程度的數據校驗,有效地保障數據準備性。
  (2) 通過設置sql model 為ansi 模式,來保證大多數sql符合標準的sql語法,這樣應用在不同數據庫之間進行遷移時,則不需要對業務sql 進行較大的修改。
  (3) 在不同數據庫之間進行數據遷移之前,通過設置SQL Mode 可以使MySQL 上的數據更方便地遷移到目標數據庫中。

  1. 演示sql model 嚴格模式

  從mysql 5.7 開始, 默認是嚴格模式, mysql 開始嚴格遵從SQL 92規範。通過strict_trans_tables嚴格模式實現了數據的嚴格校驗。 使錯誤數據不能插入表中, 從而保證了數據的準確性。

-- 查看sql model 模式
  SELECT @@sql_mode;

  技術分享圖片

--  下面可將sql model設置為嚴格模式
set session sql_mode=STRICT_TRANS_TABLES;
--  新建表設置address為10個長度
CREATE TABLE test_sqlmode
(
   address 
VARCHAR(10) ) -- 插入超過長度 INSERT INTO test_sqlmode VALUES(123456789123);

  通過下圖可以看出, 嚴格模式下超出數據 插入將報錯。 如果不是嚴格模式,則會報warning 警告 並截取字符。

  技術分享圖片

  2. sql mode 組合模式

    組合模式類似於角色和權限的關系。這樣當實際應用時,只需要設置一個模式組合,就可以設置很多的原子模式,大大方便了用戶的工作。

ANSI模式

寬松模式,對插入數據進行校驗,如果不符合定義類型或長度,對數據類型調整或截斷保存,報warning警告。

等同於REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE 和ANSI

組合模式

traditional 模式

嚴格模式,當向mysql數據庫插入數據時,進行數據的嚴格校驗,保證錯誤數據不能插入,報error錯誤。用於事務時,會進行事務的回滾。

TRADITIONAL 模式等同於STRICT_TRANS_TABLES、STRICT_ALL_TABLES、

NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、TRADITIONAL

和NO_AUTO_CREATE_USER 組合模式

STRICT_TRANS_TABLES模式

嚴格模式,進行數據的嚴格校驗,錯誤數據不能插入,報error錯誤。

例如:不允許非法日期,也不允許超過字段長度的值插入字段中,對於插入不正確的值給出錯誤而不是警告

二. sql model 遷移如何使用

    如果mysql 與其它異構數據庫之間有數據遷移的需求時,那麽mysql中提供的數據庫組合模式則會對數據遷移過程會有所幫助。對導出數據更容易導入目標。

技術分享圖片

  在數據遷移過程中,可以設置SQL Mode 為NO_TABLE_OPTIONS 模式,這樣將去掉show create table 中的“engine”關鍵字,獲得通用的建表腳本。

-- 查看表有 engine 引擎
SHOW CREATE TABLE test_sqlmode;

技術分享圖片

-- 將所有表去掉engine 引擎。變為通用表
-- 修改 當前會話下的sql model
SET SESSION sql_mode=NO_TABLE_OPTIONS

技術分享圖片

mysql 開發基礎系列22 SQL Model