为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: DM Database Server 64 V8,DB Version: 0x7000c
【操作系统】:麒麟10
【CPU】:arm
【问题描述】*:达梦数据库varchar 类型中文乱码问题
插入sql:
INSERT INTO "test_audit"."operation" "role", "source" VALUES (?, ?)", values: [VARCHAR("管理员"), VARCHAR("API")]
这里以 operation表的role 字段为例,插入值 管理员
tcp 抓包分析
\xE7\xAE\xA1\xE7\x90\x86\xE5\x91
\xE7\xAE\xA1\xE7\x90\x86\xE5\x91\x98
https://eco.dameng.com/document/dm/zh-cn/app-dev/c_c++_odbc.html
以达梦odbc demo为例,在数据权限网关容器中便携相关c 程序,插入相关数据
抓包分析,同样也会被截取一个字节的数据
重新在arm 环境中搭建达梦数据库,修改数据库编码为 utf8!
0 代表 gb18030;1 代表 UTF-8
SQL> select unicode;
+------------+
| unicode |
+------------+
| 1 |
+------------+
SQLRowCount returns 1
1 rows fetched
SQL>
重新插入数据,数据依然乱码
抓包依然显示截断一个字节
通过输出日志和抓包分析,arm 环境下达梦odbc-driver 对于中文编码会出现截取字节的问题,导致存储到数据库的数据错误;
请比对SQLBindParameter时候入参绑定的长度是否对齐,另外可在odbc中增加如下trace查看接口层出入参长度信息是否符合预期
[ODBC]
Trace=1
TraceFile=/tmp/odbctrace
ForceTrace=Yes
TraceDll=/dm/dmdbms/bin/libdmtrc.so
UseCursorLib=0
ODBCTraceFlush=1
TraceOptions=0