FreeTDS:如何设置运行存储过程的参数字符集

我有一个C程序通过FreeTDS连接到MSSQL数据库。

我试图执行一个存储过程与varchar参数设置为“SaídaLiberada”,但它存储与奇怪的字符在MS SQL,如上面的截图:

赛义德·莱博拉达与错误的人物

这是我的freetds.conf:

# $Id: freetds.conf,v 1.12 2007/12/25 06:02:36 jklowden Exp $ # # This file is installed by FreeTDS if no file by the same # name is found in the installation directory. # # For information about the layout of this file and its settings, # see the freetds.conf manpage "man freetds.conf". # Global settings are overridden by those in a database # server specific section [global] # TDS protocol version tds version = 8.0 # Whether to write a TDSDUMP file for diagnostic purposes # (setting this to /tmp is insecure on a multi-user system) dump file = /tmp/freetds.log ; debug flags = 0xffff # Command and connection timeouts ; timeout = 10 ; connect timeout = 10 # If you get out-of-memory errors, it may mean that your client # is trying to allocate a huge buffer for a TEXT field. # Try setting 'text size' to a more reasonable limit text size = 64512 client charset = UTF-8 

这是tds转储文件的一部分:

 log.c:196:Starting log file for FreeTDS 0.91 on 2016-05-17 19:19:41 with debug flags 0x4fff. iconv.c:330:tds_iconv_open(0xaed19130, ISO-8859-1) iconv.c:353:Using trivial iconv iconv.c:187:local name for ISO-8859-1 is ISO-8859-1 iconv.c:187:local name for UTF-8 is UTF-8 iconv.c:187:local name for UCS-2LE is UCS-2LE iconv.c:187:local name for UCS-2BE is UCS-2BE iconv.c:349:setting up conversions for client charset "ISO-8859-1" iconv.c:351:preparing iconv for "ISO-8859-1" <-> "UCS-2LE" conversion iconv.c:391:preparing iconv for "ISO-8859-1" <-> "ISO-8859-1" conversion iconv.c:394:tds_iconv_open: done ... net.c:741:Sending packet 0000 01 01 00 84 00 00 00 00-20 45 58 45 43 20 55 50 |........ EXEC UP| 0010 5f 49 4e 53 45 52 54 4d-4f 56 49 4d 45 4e 54 4f |_INSERTM OVIMENTO| 0020 20 27 32 30 31 36 2d 30-35 2d 31 37 20 31 39 3a | '2016-0 5-17 19:| 0030 31 39 3a 33 31 2e 30 30-30 27 2c 27 30 30 30 30 |19:31.00 0','0000| 0040 30 30 30 30 30 30 36 34-38 33 30 35 37 30 33 30 |00000064 83057030| 0050 27 2c 27 53 27 2c 30 2c-32 2c 27 50 43 56 43 30 |','S',0, 2,'PCVC0| 0060 34 20 3d 20 53 61 c3 ad-64 61 20 4c 69 62 65 72 |4 = Sa.. da Liber| 0070 61 64 61 27 2c 34 2c 27-50 43 56 43 4d 41 4e 41 |ada',4,' PCVCMANA| 0080 47 45 52 27 - |GER'| 

根据freetds日志,它发送的字符'í'(我尖锐)为c3广告,这意味着它发送为UTF-8(拉丁文小册子与急性)。

我怎样才能设置客户端或服务器,所以string可以正确存储?

更新1:

 # tsql -C Compile-time settings (established with the "configure" script) Version: freetds v0.91 freetds.conf directory: /etc MS db-lib source compatibility: no Sybase binary compatibility: yes Thread safety: yes iconv library: no TDS version: 4.2 iODBC: no unixodbc: yes SSPI "trusted" logins: no Kerberos: no # 

更新2

代码连接:

 ret = SQLDriverConnect(db_msserver_dbc_handle, NULL, "Driver={FreeTDS};Server=FooBar;Port=1433;Database=Foo;UID=sa;PWD=pwd@123;APP=XPTO;TDS_Version=8.0;", SQL_NTS, outstr, sizeof(outstr), &outstrlen, SQL_DRIVER_COMPLETE); 

经过大量的尝试,我无法弄清楚为什么freetds.conf设置(客户端字符集和tds版本)没有得到尊重。 至少,当我将TDS_Version = 8.0; ClientCharset = UTF-8添加到连接字符串中时 ,它工作正常!

更改连接字符串时记录正确存储

 "Driver={FreeTDS};server=%s;Port=%s;Database=%s;UID=%s;PWD=%s;APP=%s;TDS_Version=8.0;ClientCharset=UTF-8" 

此外,freetds日志文件的标题被改变,提到UTF-8转换:

 log.c:196:Starting log file for FreeTDS 0.91 on 2016-05-18 15:58:49 with debug flags 0x4fff. iconv.c:330:tds_iconv_open(0xaeb19118, UTF-8) iconv.c:353:Using trivial iconv iconv.c:187:local name for ISO-8859-1 is ISO-8859-1 iconv.c:187:local name for UTF-8 is UTF-8 iconv.c:187:local name for UCS-2LE is UCS-2LE iconv.c:187:local name for UCS-2BE is UCS-2BE iconv.c:349:setting up conversions for client charset "UTF-8" iconv.c:351:preparing iconv for "UTF-8" <-> "UCS-2LE" conversion iconv.c:391:preparing iconv for "ISO-8859-1" <-> "UCS-2LE" conversion iconv.c:394:tds_iconv_open: done