sql-mode


SQL Modes 預設值

5.6.5 舊版之前,預設定是空的,沒有設置

之後的版本,預設定是 NO_ENGINE_SUBSTITUTION STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_...

查詢目前設定值

SHOW VARIABLES LIKE 'sql_mode';

SELECT @@GLOBAL.sql_mode; --- GLOBAL 是修改目前伺服器的設定值
SELECT @@SESSION.sql_mode; --- SESSION 是修改目前連線的設定值

設定 sql-mode 方式

  1. 修改設定檔(my.cnf或my.ini)中的 sql-mode="設定值"
  2. MySQL啟動時,加參數 --sql-mode="設定值"

  3. 連線登入後修改
    SET GLOBAL sql_mode='設定值';

    SET SESSION sql_mode='設定值';

strict mode (嚴格模式)

STRICT_TRANS_TABLES:對有交易功能的儲存引擎,開啟嚴格模式,也可能對無交易功能的儲存引擎開啟嚴格模式
STRICT_ALL_TABLES:對有所有儲存引擎,開啟嚴格模式。

在「STRICT_TRANS_TABLES」模式中,

對「無交易功能的儲存引擎」的效果,是看不合法語句是否在最前面出現而決定。

當 insert 或 update 的不合法值,是出現在最前面,

則不管儲存引擎是否有交易功能,都是直接出錯中止。

例如:INSERT INTO ww (aa) VALUES (333),(44),(22);

aa 是 tinyint 形態,333 超出範圍,所以直接報錯中止,三個值都無法寫入。

當 insert 或 update 的不合法值,不是出現在最前面。

例如:INSERT INTO ww2 (aa) VALUES (33),(444),(22);

aa 是 tinyint 形態

對「有交易功能的儲存引擎」而言,33、444、22 都無法寫入

對「無交易功能的儲存引擎」而言,三個值都可以寫入,但444會變改成127,也就是變成 33、127、22

結論: STRICT_TRANS_TABLES 在不合法語句在最前面時,才對 「無交易功能的儲存引擎」有作用。

results matching ""

    No results matching ""