Postgres+ODBC+OTL windows客户端C++代码乱码问题(附源码)

张开发
2026/4/16 18:29:02 15 分钟阅读

分享文章

Postgres+ODBC+OTL windows客户端C++代码乱码问题(附源码)
在新项目POC时AI助手快速生成的验证项目后台C OTL实现快速SQL业务代码通过ODBC连接PostgreSQL发现C控制台输出cout 乱码DBeaver或Postgres后台psql查询数据乱码引发问题多方排查未解决特此留痕。供参考。源码下载参考附件。项目背景C OTL模板业务代码psqlODBC驱动,Postgres后台部署在Ubuntu2404,ver18.3其中C项目CMakelists.txt 设置add_definitions(-DUNICODE -D_UNICODE)main.cpp 使用utf8编码设置控台输出utf8:在:main(){#ifdef _WIN32SetConsoleOutputCP(CP_UTF8);#endif// todo...}一、检查Postgres后台客户端字符集部署postgres服务端Ubuntu登录psql后执行select name, setting, context from pg_settings where name like %encoding%;二、检查代码层控制台输出2.1 cout 测试中文;预期显示正常“测试中文”2.2 设置ODBC连接串DSN关键必须加“ConnSettingsSET CLIENT_ENCODING TO UTF8;”无论是使用DRIVER{PostgreSQL Unicode(x64)} 还是 DRIVER{PostgreSQL ANSI(x64)}参考DSN// 使用Unicode驱动 const string CONNECTION_STR_W DRIVER{PostgreSQL Unicode(x64)}; SERVER192.168.1.15; PORT5432; DATABASEpostgres; UIDpostgres; PWDtlox2026; ConnSettingsSET CLIENT_ENCODING TO UTF8;; // ClientEncodingUTF-8; // 使用ANSI驱动 const string CONNECTION_STR_A DRIVER{PostgreSQL ANSI(x64)}; SERVER192.168.1.15; PORT5432; DATABASEpostgres; UIDpostgres; PWDtlox2026; ConnSettingsSET CLIENT_ENCODING TO UTF8;; // ClientEncodingUTF-8 // Debug1; // ANSI 驱动可以指定字符集三、结果验证参考步骤2中设置DSN串包含ConnSettingsSET CLIENT_ENCODING TO UTF8; 时Postgres服务端查询数据正常DBeaver查询数据正常反例验证注释或删除DSN中包含ConnSettingsSET CLIENT_ENCODING TO UTF8;重新编译运行运行效果控制台输出正常数据库后台数据乱码工具查询数据乱码再次验证DSN加上ConnSettingsSET CLIENT_ENCODING TO UTF8;结果恢复正常。切换驱动方式验证默认是ANSI即 CONNECTION_STR_A切换到CONNECTION_STR_W即Unicode效果类型关键还是ConnSettingsSET CLIENT_ENCODING TO UTF8; 影响最后数据。

更多文章