使用dotConnectForPostgreSQL向PostgreSQL插入特殊字符报错排查
解决PostgreSQL插入特殊字符时的UTF8编码错误
问题描述
使用.NET Framework 4.6.1 + NHibernate + PostgreSQL 11,插入包含Ã_Ã的字符数据时,提交事务报错:
invalid byte sequence for encoding "UTF8": 0xc3 0x5f
执行的手动拼接SQL语句为:
INSERT INTO XXXXXXX(key, file_name, file_path, source_id) VALUES (E'XXXX', E'Ã_Ã', 'Ã_Ã.xlsx', XXX5)
报错原因
0xc3 0x5f不是合法的UTF-8字节序列:UTF-8中以0xc3开头的字节必须跟一个10xxxxxx格式的后续字节,而0x5f(下划线的ASCII码)不符合该规则,说明字符在转码过程中被破坏,大概率是编码配置不匹配或手动SQL拼接导致的编码错误。
解决方案
1. 确保数据库连接字符串指定UTF-8编码
在PostgreSQL连接字符串中显式添加Encoding=UTF8,强制连接使用UTF-8编码,避免NHibernate与数据库间的编码不匹配:
Server=你的服务器地址;Database=你的数据库名;User Id=用户名;Password=密码;Encoding=UTF8;
2. 使用NHibernate参数化查询,避免手动SQL拼接
放弃手动拼接SQL的方式,直接通过NHibernate的实体映射保存数据,ORM会自动处理编码转换,避免E'...'语法导致的编码混乱:
var targetEntity = new YourEntityClass { Key = "XXXX", FileName = "Ã_Ã", FilePath = "Ã_Ã.xlsx", SourceId = XXX5 }; using (var transaction = session.BeginTransaction()) { session.Save(targetEntity); transaction.Commit(); }
3. 验证数据库及表的编码设置
检查数据库和目标表是否使用UTF-8编码:
- 查询数据库编码:
SELECT datname, encoding FROM pg_database WHERE datname = '你的数据库名';
(正常结果中encoding应为6,对应UTF8)
- 查询表的字符集配置:
SELECT pg_get_table_def('你的表名'::regclass);
若编码不是UTF8,需备份数据后修改数据库/表的编码。
4. 确认NHibernate方言配置正确
在NHibernate配置文件(如hibernate.cfg.xml)中,指定对应PostgreSQL 11的方言,确保ORM能正确适配数据库的编码处理:
<property name="dialect">NHibernate.Dialect.PostgreSQL11Dialect</property>
内容的提问来源于stack exchange,提问作者Goli Someshwar
相关产品推荐
相关产品推荐

