偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

從 MySQL 遷移到 GoldenDB,這個(gè)參數(shù)記得改!

數(shù)據(jù)庫(kù) MySQL
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ù)遷移很有幫助。

大家好,我是君哥。

最近從 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ù)遷移很有幫助。

責(zé)任編輯:武曉燕 來(lái)源: 君哥聊技術(shù)
相關(guān)推薦

2025-10-29 08:06:49

2025-09-10 07:53:52

2013-06-21 13:49:08

MariaDB

2013-05-03 09:49:38

MySQLMariaDB

2010-09-29 11:06:21

活動(dòng)目錄OpenLDAP

2017-10-20 08:45:15

數(shù)據(jù)庫(kù)MongoDBMySQL

2010-07-20 09:48:33

2012-05-21 10:23:36

2019-11-15 09:02:50

OpenJDKGitHub

2016-10-26 16:44:44

WatchfinderAWS云計(jì)算

2011-06-24 10:10:35

SVN

2021-11-29 09:44:03

UmiJSVite前端

2020-07-27 11:35:26

GitHub代碼開(kāi)發(fā)者

2022-06-06 07:24:09

Caddy開(kāi)源Ubuntu

2011-04-25 09:35:31

TwitterJava

2009-02-06 10:32:00

UnixLinux服務(wù)器

2016-11-11 00:00:16

MySQLOracle數(shù)據(jù)

2012-02-24 09:34:48

SVNGit

2020-09-09 09:38:47

GoLangNodeJS編程語(yǔ)言

2022-07-27 22:48:29

消息中間件RocketMQ架構(gòu)設(shè)計(jì)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)