news 2026/10/15 12:36:59

从 MySQL 迁移到 GoldenDB,这个参数记得改!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从 MySQL 迁移到 GoldenDB,这个参数记得改!

最近从 MySQL 迁移到 GoldenDB,踩过一个坑。之前分享过。再来回顾一下。

事故现场

我们先创建一张表 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 条数据,如下图:

INSERT INTO test_1(column1,date_time)VALUES ('a',NOW());

然后我们创建一张跟 test1 表结构一样的表 test2,

CREATE TABLE test_2 LIKE test_1;

执行下面 SQL,

insert into test_2(column1,date_time) select "column1", now() from test_1;

这条 SQL 并不复杂,从 test1 表查出数据写到 test2 表。但不知道写代码的小伙伴出于什么考虑在 column1 上加了双引号。这个 SQL 在 MySQL(8.0 版本)上执行是没有问题的,但是放到了 GoldenDB 上就报错了,因为双引号包着的字段返回的是 column1 这个字符串,最终字段超长报错(Data too long for column 'column1' at row 1)。

问题根因

如果这个坑直接甩锅给 GoldenDB,并不合适。为什么这么说呢?公司专业的 DBA 大佬给了解答,之所以这个 SQL 在 MySQL 上运行没问题,在 GoldenDB 上就会出错,是因为 ANSI_QUOTES 这个参数配置不一致。

ANSI_QUOTES 是 MySQL 数据库中的 SQL 模式选项,用于调整标识符与字符串常量的引用规则,使其符合 ANSI SQL 标准。可以使用下面的 SQL 临时开启:

-- 仅对当前会话开启 SET SESSION sql_mode = 'ANSI_QUOTES'; -- 对之后的所有新连接生效(重启后失效) SET GLOBAL sql_mode = 'ANSI_QUOTES';

或者修改配置文件开启,这样可以永久生效。

ANSI_QUOTES 介绍

开启

开启 ANSI_QUOTES 后,双引号 (") 被解释为标识符引号,作用与反引号 (`) 相同,用于引用数据库、表、字段等名称。例如下面 SQL 中的 name 被解释为列名,而 my_table 被解释为表名。

SELECT "name" FROM "my_table";

而单引号则被解释为字符串,比如下面 SQL 查找结果返回 name 这个字符串:

SELECT 'name' FROM my_table;

关闭

关闭 ANSI_QUOTES 后(默认关闭),双引号 (") 被解释为字符串引号,与单引号 (') 的作用完全相同。反引号 (`) 被用于引用标识符(如数据库名、表名、字段名)。下面的两个 SQL 返回的都是 name 这个字符串:

SELECT 'name' FROM my_table; SELECT "name" FROM my_table;

为什么要使用 ansi_quotes 呢?主要有 2 个原因:

1.兼容性和可移植性

如果你的应用程序需要与多种遵循 ANSI SQL 标准的数据库(如 PostgreSQL, Oracle, GoldenDB)保持兼容,启用 ANSI_QUOTES 会很有帮助。这可以统一使用双引号来引用标识符,而不用担心数据库迁移会发生因为引号导致的异常。在信创改造的大背景下,这个参数作用很大。

2.SQL 规范

一些开发团队要求必须遵循 SQL 标准,明确区分单引号用于字符串,双引号用于标识符。这可以使 SQL 的意图更加清晰,减少歧义。

总结

ANSI_QUOTES 是 MySQL 数据库中的 SQL 模式选项,用于调整标识符与字符串常量的引用规则,使其符合 ANSI SQL 标准。这个配置开启,对于 SQL 规范化和数据库迁移很有帮助。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 12:36:37

Android FreeRDP SO编译实战:ABI对齐、BoringSSL适配与NDK r23兼容

简介:本资源提供已编译完成的Android平台FreeRDP原生库(SO文件),面向Android中高级开发者,解决在移动应用中快速集成RDP远程桌面连接功能的技术门槛问题。无需从源码手动配置NDK、CMake及交叉编译环境,开箱…

作者头像 李华
网站建设 2026/10/15 12:36:33

连连看小程序核心算法拆解:棋盘生成、连通判定与消除逻辑

简介:一份基于 C# 开发的连连看休闲小游戏完整源码,面向初学 C# 与游戏编程的开发者,用于理解图形匹配消除类项目的整体实现,适合作为自学练手、课程设计或毕设参考。资源共 42 个文件,压缩包约 4.57MB,包含…

作者头像 李华
网站建设 2026/10/15 12:36:23

自考本科和成考本科到底差在哪,别被“含金量“话术带偏

我被问得频繁的一个问题,就是自考本科和成考本科哪个好。说句实话,这问题本身就有点问歪了——两者都是国家承认、学信网可查的成人本科学历,用途上并没有谁比谁"高一等"的说法。真要分清,得看它们怎么入学、怎么读、怎…

作者头像 李华
网站建设 2026/10/15 12:35:56

Matlab时域频域特征提取实战:从峭度到频谱质心的核心方法

简介:一套面向MATLAB用户的时域与频域特征提取实战资源,适合信号处理初学者以及需要做数据分析的学生、工程师。它从原始信号出发,系统讲解并实现了时域统计特征(均值、峰值、均方根、峭度、尖峰因子)与频域特征&#…

作者头像 李华
网站建设 2026/10/15 12:35:54

Flutter支付SDK鸿蒙适配实战与优化

1. 项目背景与核心价值在移动应用开发领域,支付功能集成一直是商业应用的核心模块。Flutter作为跨平台开发框架,其丰富的三方库生态为开发者提供了诸多便利。paypal_sdk作为Flutter生态中重要的支付集成库,在全球范围内被广泛应用于电商、金融…

作者头像 李华
网站建设 2026/10/15 12:35:50

模拟CMOS课后答案怎么用?从目录核验到个人题库的复习方法

简介:《拉扎维模拟CMOS集成电路》第二版最新习题答案,以单份PDF文件呈现,内含完整目录,可按章节快速定位。资源面向正在系统学习模拟集成电路设计、需要核对课后习题的电子工程专业学生和设计从业者,尤其适合第二章场效…

作者头像 李华