合肥專業(yè)做網(wǎng)站的互聯(lián)網(wǎng)域名注冊查詢
現(xiàn)象:
我在兩個mysql庫都有相同定義的表,其中一個字段是varchar(1200)。當我都對這個表進行insert操作,而且超過此字段的規(guī)定長度(此處是1200),這兩庫的行為是不一樣的:庫B是直接報錯too long,庫A卻不報錯,只是在程序后臺觀察到返回了warning。這是為什么?
文心的解釋
在MySQL中,對于超出定義長度的VARCHAR字段進行插入操作時,行為可能會因為不同的SQL模式(SQL Modes)而有所不同。SQL模式定義了MySQL應(yīng)該支持的SQL語法、數(shù)據(jù)驗證以及如何處理錯誤等情況。
SQL模式差異:
嚴格模式(STRICT_TRANS_TABLES):當啟用嚴格模式時,如果嘗試插入的數(shù)據(jù)超出了字段定義的范圍,MySQL會報錯并拒絕執(zhí)行該操作。
非嚴格模式:在不啟用嚴格模式時,MySQL可能會接受超長的數(shù)據(jù),但會截斷數(shù)據(jù)到允許的最大長度,并生成一個警告(warning)而不是錯誤。
兩個數(shù)據(jù)庫可能配置了不同的SQL模式。一個數(shù)據(jù)庫可能啟用了嚴格模式,而另一個沒有。
檢查SQL模式:
要查看當前會話的SQL模式,可以使用以下SQL命令:SELECT @@sql_mode;
要查看全局SQL模式,可以使用:SELECT @@GLOBAL.sql_mode;
實踐驗證
庫A:
SELECT @@sql_mode;返回 STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION。而SELECT @@GLOBAL.sql_mode;返回NO_ENGINE_SUBSTITUTION。
庫B:
SELECT @@sql_mode;返回ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。
SELECT @@GLOBAL.sql_mode;返回ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。
可以看到庫A的全局級別SQL模式?jīng)]有嚴格模式STRICT_TRANS_TABLES,而庫B有。這可能就是原因。