Sql server 无法通过MS SQL 2008中的freetds unixODBC插入unicode字符 我在RHEL 5上构建了一个C++应用程序,它通过Windows机器上的FRIEDS和UNIXODBC连接到MS SQL 2008。

Sql server 无法通过MS SQL 2008中的freetds unixODBC插入unicode字符 我在RHEL 5上构建了一个C++应用程序,它通过Windows机器上的FRIEDS和UNIXODBC连接到MS SQL 2008。,sql-server,sql-server-2008,unicode,freetds,unixodbc,Sql Server,Sql Server 2008,Unicode,Freetds,Unixodbc,这是应用程序发送到数据库的查询 插入mytable(示例)值(N'乕乭 SQL Server将UTF-16用于NVARCHAR。从您问题中的信息来看,您的UTF-8中似乎有字符串。在将insert语句发送到SQL Server之前,请先将其转换为UTF-16 更新:我看到您添加了代码示例。我看到您将值添加到UnicodeString实例中。这些值是4字节宽。您需要添加值(2字节宽)。这里的ICU UnicodeString文档()说“在ICU中,Unicode字符串由16位Unicode代码单

这是应用程序发送到数据库的查询


插入mytable(示例)值(N'乕乭 SQL Server将UTF-16用于
NVARCHAR
。从您问题中的信息来看,您的UTF-8中似乎有字符串。在将insert语句发送到SQL Server之前,请先将其转换为UTF-16



更新:我看到您添加了代码示例。我看到您将值添加到
UnicodeString
实例中。这些值是4字节宽。您需要添加值(2字节宽)。

这里的ICU UnicodeString文档()说“在ICU中,Unicode字符串由16位Unicode代码单元组成。”由于您使用
SQLStatement.getTerminatedBuffer()
获取该数据,因此当您获取该数据并将其推入SQLExecDirectW()时,我将其理解为UTF-16中的数据


另一方面,您可以在FreeTDS配置中指定
client charset=UTF-8
。因为它与本机客户端一起工作,所以我会尝试将FreeTDS客户端的charset更改为UTF-16。

SAMPLE
列的数据类型必须是
NVARCHAR
是数据类型是
NVARCHAR
您使用的FreeTDS的哪个版本?0.95,0.91?TDS版本7.3只在FRIETDS 0.95中支持。我相信有RHEL 6的0.91个船,但我不确定RHEL 5。当通过使用<代码> C++ SQLServer本地客户机10 < /COD> ODBC驱动程序成功地插入数据库时,在同一个查询中调用相同查询的可能副本。我不确定FreeTDS可能是什么B。e在这里做。@D3XT3R查看实际插入的内容,这闻起来像是缩小到UTF-16字符串中的单字节而不是双字节。就像测试一样,将字符串转换为字节数组,并将字符串作为
insert插入mytable(示例)值(强制转换(0x为NVARCHAR(4000))其中,字节模式是UTF 16中字符串的十六进制形式的一系列字节。@ d3xt3r,你应该真正考虑添加一个问题到你的问题(即复制你所遇到的问题的代码)。问题可能是在代码中而不是在自由驱动程序中。你使用的是UTF 16中的字符串类型吗?(小恩迪安)顺便说一句。@D3XT3R我来自JAVA/SQL Server的背景…我主要是从我对SQL Server的了解以及您在问题中描述的症状开始的。如果您希望C++/FreeDTS方面的专家能够告诉您在该级别上可能存在的错误,那么MVCE是非常必要的。将我的字符集更新为UTF-16同样的问题依然存在。