5,908
社区成员




第一次接触delphi+ODBC+mysql+ado,为什么和delphi+mssql+ado不一样?
ado.sql.Add('update 登录表 set 状态=:状态');
ado.Parameters.ParamValues['状态'] := '在线';
ado.execsql;
竟然不对,必须要写成:
ado.sql.Add('update 登录表 set 状态='+quotedstr('在线'));
才可以。以上语句在delphi+mssql+ado中正常,请教为什么呢?
嘿嘿,完全搞定,完美总结一下,以下在win7+D10.3.2+mysql5.3+ODBC+ado中验证通过:
1、mysql端一定要使用gbk,服务器、客户端、数据库、数据表、my.ini中设置一致。
2、ODBC使用unicode驱动,并设置misc中的read option from my.cnf为选中状态(重要)
3、D10是32位的不要妄想连接ODBC64位的驱动,数据库、应用软件、驱动、系统必须一致
结果:字段和值显示汉字正常,查询、修改操作正常。
白高兴了,ansi可以修改,但汉字字段名显示还是乱码,fieldbyname取不到字段值,我勒个去的。
继续研究。
搞定了,是我自做聪明了,无意中又试了试ODBC使用ansi驱动,成功,欧耶。
开始mysql的字符集时latin1,我使用ansi驱动汉字乱码,使用unicode后正常显示,光测试客户端的字符集了,一直没有测试ansi驱动,偶然一试,问题解决。
ODBC需要驱动,麻烦的很,更麻烦的是用ODBC连Oracle,中文乱码的问题搞了我半个月,非字符集问题
研究了很久,总结一下问题:
1、navicat中用语句 update 表 set 中文字段名=‘中文’ 没有问题
2、表的中文字段修改为英文字段,delphi中update赋值中文没有问题
3、delphi中select where中用中文字段赋值中文变量没有问题
4、ado.sql.Add('update 登录表 set 状态='+quotedstr('在线'));时也没有问题
仅在表中是中文字段时,delphi用update语句赋值时出现错误
目前懵逼中,请高手解惑。
不过,有趣的是,我的select语句使用where 字段名=:变量名,后续赋值
ado.Parameters.ParamValues['字段名'] := '变量';
就没有任何问题。
奇怪。
网上查了所有的可能,还是字符集的问题,把所有的设置修改为utf8、utf8mb4,均不成功,真是没招了,哈
mysql已经全部配置为 utf8 编码方式,查询显示正常,ODBC也是使用unicode的驱动,可以正确识别中文。
错误显示:incorrect string value:'\xD4\xDA\xCF\xDF' for column '状态' at row 128.