现在讨论的是Symfoware的ODBC,至于其它API是否这样,还不清楚。
Symfoware是支持客户端内码的,即Server端和Client端使用不同的内码时,可以指定由客户端来转换从Server端返回的消息。例如,Server端是UTF8格式,Client端是SJIS格式,默认情况下是Server端转码,这样Server端会把消息的内码自动转成Client能识别的SJIS格式,如果设置了CLI_CHARACTER_TANSLATE=(CLIENT)的DSN参数,Server就会把自己的UTF8内码格式的消息原封不动地返回给CLient,由Client进行处理。一般来说还有个参数CHAR_SET,可以在客户端指定转成什么类型的内码。
从外部功能来说,是这样的,但是实施起来,却不这么顺利。
下面采取这样的组合
Server Client 消息内容
SJIS SJIS SJIS
SJIS UTF8 SJIS
UTF8 SJIS UTF8
UTF8 UTF8 UTF8
从结果上来看,还是取决于Server端内码,客户端转码没有生效,使用SQL_SNAP打开日志分析一下子,只是相关的标示为从80000000---->00000000,说明客户端转码的设置是被接受的,至于为什么不能实现客户端转码,就令人费解了。
我觉得,像这种环境类的设置,不外乎四个地方,
- 在MS的odbcad.exe里创建数据源时,添加参数CLI_CHARACTER_TANSLATE=(CLIENT)
- 在注册表odbc数据源.ini项,添加CLI_CHARACTER_TANSLATE之类的键值
- 在连接字符串中添加CLI_CHARACTER_TANSLATE参数
- 执行SQL 语句如“SET CLI_CHARACTER_TANSLATE ”之类,这个Symfoware会报错,MySQL到是支持
不管怎么试,总是解决不了问题,看来是个Bug!