使用npgsql.NET操作PostgreSQL遇到两类问题求助
PostgreSQL操作问题解答
问题1:创建带特殊字符表名时的语法错误
报错原因是PostgreSQL中,包含#这类特殊字符的标识符(表名、列名等)必须用双引号包裹。你直接使用Pronner#2223作为表名,PostgreSQL会把#当成语法符号,导致语法错误。
修正方法
不要直接拼接字符串到SQL里(存在SQL注入风险),推荐用参数化方式处理表名,或者给表名加上双引号:
CREATE TABLE "Pronner#2223" ( user_id serial PRIMARY KEY, username VARCHAR ( 50 ) UNIQUE NOT NULL, password VARCHAR ( 50 ) NOT NULL, email VARCHAR ( 255 ) UNIQUE NOT NULL, created_on TIMESTAMP NOT NULL, last_login TIMESTAMP );
如果用Npgsql的安全写法,可通过内置方法转义标识符:
var tableName = textBox1.Text; using var cmd = new NpgsqlCommand($"CREATE TABLE \"{NpgsqlCommand.EscapeIdentifier(tableName)}\" (...)", conn); cmd.ExecuteNonQuery();
NpgsqlCommand.EscapeIdentifier会自动处理特殊字符和大小写问题,避免手动拼接出错。
问题2:表名大小写显示问题
这是PostgreSQL的标识符大小写机制导致的,不是pgAdmin 4的显示问题。
PostgreSQL的核心规则:
- 未用双引号包裹的标识符(表名、列名),会自动转换为小写存储和识别。
- 用双引号包裹的标识符,会严格保留大小写。
你创建表时写的CREATE TABLE PRONNER (...),因为没加双引号,PostgreSQL会自动转成pronner存储,所以pgAdmin显示的是实际存储的表名。如果要保留大写,需要用双引号:
CREATE TABLE "PRONNER" ( -- 表结构 );
和MySQL的区别:MySQL默认对标识符大小写不敏感(取决于操作系统和lower_case_table_names配置),而PostgreSQL的规则更严格,依赖双引号来区分大小写。
内容的提问来源于stack exchange,提问作者ZiAD
相关产品推荐
相关产品推荐

