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