PostgreSQL 14.2添加分号后出现未终止引号字符串错误求助
PostgreSQL 14.2 INSERT语句含分号时触发"unterminated quoted string"错误的解决方案
问题本质
你遇到的错误是因为字符串中的分号被SQL解析器/客户端工具误判为语句结束符,提前截断了INSERT语句,导致引号未闭合;同时嵌套单引号的转义逻辑在复杂场景下也容易引发解析异常。
最优解决方案
直接使用PostgreSQL专属的美元符号引用(Dollar-Quoted Strings),彻底规避单引号转义和分号截断问题,这是处理含特殊字符SQL字符串的标准方案。
修改后的可执行SQL
INSERT INTO engine_migrations ("name", "description", "schema", "created_at", "up", "down", "active") VALUES ( 'Create Table users', 'undefined', '{"resource":"Table","migration":{"name":"users","primaryKey":"SERIAL"},"operation":"Create"}', '2023-08-18T09:40:49.55656Z', '', $$DELETE FROM "public"."engine_tables" WHERE name = 'users';DROP TABLE "public"."users";$$, true );
方案说明
- 用
$$包裹down字段内容后,PostgreSQL会将$$之间的所有内容视为完整字符串,不会解析其中的单引号、分号等特殊字符 - 若担心
$$与内容冲突,可自定义唯一标签,比如$migration_sql$DELETE FROM ...;DROP TABLE ...;$migration_sql$
备选方案(不推荐)
如果必须用单引号包裹,需确保所有单引号正确转义,同时配置客户端工具不将字符串内的分号识别为语句结束符(不同工具设置不同),修改后语句如下:
INSERT INTO engine_migrations ("name", "description", "schema", "created_at", "up", "down", "active") VALUES ( 'Create Table users', 'undefined', '{"resource":"Table","migration":{"name":"users","primaryKey":"SERIAL"},"operation":"Create"}', '2023-08-18T09:40:49.55656Z', '', 'DELETE FROM "public"."engine_tables" WHERE name = ''users'';DROP TABLE "public"."users";', true );
注:此方案依赖工具配置,兼容性差,优先推荐美元符号引用
内容的提问来源于stack exchange,提问作者Dicky Raambo
相关产品推荐
相关产品推荐

