從 MySQL 遷移到 GoldenDB,這個(gè)參數(shù)記得改!
大家好,我是君哥。
最近從 MySQL 遷移到 GoldenDB,踩過(guò)一個(gè)坑。之前分享過(guò)。再來(lái)回顧一下。
事故現(xiàn)場(chǎng)
我們先創(chuàng)建一張表 test_1,SQL 如下:
CREATE TABLE`test_1` (
`id`int(8) NOTNULL AUTO_INCREMENT,
`column1`varchar(1) COLLATE utf8_bin DEFAULTNULL,
`date_time` datetime DEFAULTNULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11DEFAULTCHARSET=utf8 COLLATE=utf8_bin往 test_1 插入 1 條數(shù)據(jù),如下圖:
INSERT INTO test_1(column1,date_time)VALUES ('a',NOW());然后我們創(chuàng)建一張跟 test1 表結(jié)構(gòu)一樣的表 test2,
CREATE TABLE test_2 LIKE test_1;執(zhí)行下面 SQL,
insert into test_2(column1,date_time) select "column1", now() from test_1;這條 SQL 并不復(fù)雜,從 test1 表查出數(shù)據(jù)寫到 test2 表。但不知道寫代碼的小伙伴出于什么考慮在 column1 上加了雙引號(hào)。這個(gè) SQL 在 MySQL(8.0 版本)上執(zhí)行是沒(méi)有問(wèn)題的,但是放到了 GoldenDB 上就報(bào)錯(cuò)了,因?yàn)殡p引號(hào)包著的字段返回的是 column1 這個(gè)字符串,最終字段超長(zhǎng)報(bào)錯(cuò)(Data too long for column 'column1' at row 1)。
問(wèn)題根因
如果這個(gè)坑直接甩鍋給 GoldenDB,并不合適。為什么這么說(shuō)呢?公司專業(yè)的 DBA 大佬給了解答,之所以這個(gè) SQL 在 MySQL 上運(yùn)行沒(méi)問(wèn)題,在 GoldenDB 上就會(huì)出錯(cuò),是因?yàn)?nbsp;ANSI_QUOTES 這個(gè)參數(shù)配置不一致。
ANSI_QUOTES 是 MySQL 數(shù)據(jù)庫(kù)中的 SQL 模式選項(xiàng),用于調(diào)整標(biāo)識(shí)符與字符串常量的引用規(guī)則,使其符合 ANSI SQL 標(biāo)準(zhǔn)??梢允褂孟旅娴?SQL 臨時(shí)開(kāi)啟:
-- 僅對(duì)當(dāng)前會(huì)話開(kāi)啟
SET SESSION sql_mode = 'ANSI_QUOTES';
-- 對(duì)之后的所有新連接生效(重啟后失效)
SET GLOBAL sql_mode = 'ANSI_QUOTES';或者修改配置文件開(kāi)啟,這樣可以永久生效。
ANSI_QUOTES 介紹
開(kāi)啟
開(kāi)啟 ANSI_QUOTES 后,雙引號(hào) (") 被解釋為標(biāo)識(shí)符引號(hào),作用與反引號(hào) (`) 相同,用于引用數(shù)據(jù)庫(kù)、表、字段等名稱。例如下面 SQL 中的 name 被解釋為列名,而 my_table 被解釋為表名。
SELECT "name" FROM "my_table";而單引號(hào)則被解釋為字符串,比如下面 SQL 查找結(jié)果返回 name 這個(gè)字符串:
SELECT 'name' FROM my_table;關(guān)閉
關(guān)閉 ANSI_QUOTES 后(默認(rèn)關(guān)閉),雙引號(hào) (") 被解釋為字符串引號(hào),與單引號(hào) (') 的作用完全相同。反引號(hào) (`) 被用于引用標(biāo)識(shí)符(如數(shù)據(jù)庫(kù)名、表名、字段名)。下面的兩個(gè) SQL 返回的都是 name 這個(gè)字符串:
SELECT 'name' FROM my_table;
SELECT "name" FROM my_table;為什么要使用 ansi_quotes 呢?主要有 2 個(gè)原因:
1.兼容性和可移植性
如果你的應(yīng)用程序需要與多種遵循 ANSI SQL 標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)(如 PostgreSQL, Oracle, GoldenDB)保持兼容,啟用 ANSI_QUOTES 會(huì)很有幫助。這可以統(tǒng)一使用雙引號(hào)來(lái)引用標(biāo)識(shí)符,而不用擔(dān)心數(shù)據(jù)庫(kù)遷移會(huì)發(fā)生因?yàn)橐?hào)導(dǎo)致的異常。在信創(chuàng)改造的大背景下,這個(gè)參數(shù)作用很大。
2.SQL 規(guī)范
一些開(kāi)發(fā)團(tuán)隊(duì)要求必須遵循 SQL 標(biāo)準(zhǔn),明確區(qū)分單引號(hào)用于字符串,雙引號(hào)用于標(biāo)識(shí)符。這可以使 SQL 的意圖更加清晰,減少歧義。
總結(jié)
ANSI_QUOTES 是 MySQL 數(shù)據(jù)庫(kù)中的 SQL 模式選項(xiàng),用于調(diào)整標(biāo)識(shí)符與字符串常量的引用規(guī)則,使其符合 ANSI SQL 標(biāo)準(zhǔn)。這個(gè)配置開(kāi)啟,對(duì)于 SQL 規(guī)范化和數(shù)據(jù)庫(kù)遷移很有幫助。
























