PostgreSQL如何在列中插入括号、方括号、冒号、双引号等特殊字符
PostgreSQL 存储包含特殊字符字段的正确实现方法
PostgreSQL 的普通文本类型(text、varchar)本身原生兼容大括号、中括号、双引号、冒号这类ASCII特殊字符,只要正确处理SQL语句的字符串边界规则,即可无额外开销存储这类内容,具体实现分三类场景:
优先采用参数化查询(预编译语句)
这是生产环境最推荐的方案,既可以完全避免SQL注入风险,也不需要手动处理任何特殊字符的转义逻辑。数据库驱动会自动完成字符串边界的转义适配,你要存储的{ [ " : ] }可以直接作为参数值传入,不需要做任何加工。
以Python生态的psycopg2驱动为例,实现代码如下:import psycopg2 # 建立数据库连接 conn = psycopg2.connect("dbname=你的库名 user=你的用户名") cur = conn.cursor() target_value = '{ [ " : ] }' # 特殊字符直接作为参数传入,无需手动转义 cur.execute("INSERT INTO 你的表名(你的列名) VALUES (%s)", (target_value,)) conn.commit()手动编写原生SQL的处理规则
PostgreSQL 的字符串字面量边界为单引号',而非双引号:- 要存储的内容中如果没有单引号,直接用单引号包裹所有特殊字符即可,双引号、大括号、中括号、冒号均为普通字符,不需要转义,示例:
-- 可正常执行的原生SQL INSERT INTO 你的表名(你的列名) VALUES ('{ [ " : ] }'); - 如果待存储内容本身包含单引号,需要把内容里的每个单引号替换为两个连续的单引号完成转义,示例:
-- 内容包含单引号的转义写法 INSERT INTO 你的表名(你的列名) VALUES ('用户输入的内容: it''s { [ " : ] }');
- 要存储的内容中如果没有单引号,直接用单引号包裹所有特殊字符即可,双引号、大括号、中括号、冒号均为普通字符,不需要转义,示例:
JSON/JSONB类型字段的存储注意事项
如果目标列是json/jsonb类型,需要额外符合JSON自身的语法规则:- 当这类特殊字符作为JSON结构的属性值时,JSON字符串内部的双引号需要按JSON规范做反斜杠转义,示例:
-- jsonb列存储示例 INSERT INTO 你的表名(jsonb类型列名) VALUES ('{"text_content": "{ [ \" : ] }"}'::jsonb);
- 当这类特殊字符作为JSON结构的属性值时,JSON字符串内部的双引号需要按JSON规范做反斜杠转义,示例:
常见踩坑提醒:不要用双引号包裹待存储的字符串值,比如
VALUES ("{ [ " : ] }")这类写法会被PostgreSQL识别为引用列名,直接抛出“列不存在”的语法错误。
内容的提问来源于stack exchange,提问作者Anam Qureshi
相关产品推荐
相关产品推荐

