最近由delphi7 升级到 delphi10 ,某个项目升级后数据库写库出现中文乱码问题,未找到解决办法。编译环境:Delphi 10 seattle    数据库: oracle 11g问题现象:    FDQuery1.Close;
    FDQuery1.SQL.Clear ;
    FDQuery1.SQL.Text:='INSERT INTO  T_SBXX (GJDQ,XM,CSRQ,XB)  VALUES(''CHN'',''张三'',''19920501'',''1'')‘;
    FDQuery1.ExecSQL;   这种写法数据库里 ’XM‘ 字段数据里显示是’??‘ 乱码。    FDQuery1.Close;
    FDQuery1.SQL.Clear ;
    FDQuery1.SQL.Text:='INSERT INTO  T_SBXX (GJDQ,XM,CSRQ,XB)  VALUES(:vGJDQ,:vXM,:vCSRQ,:vXB)‘;
    FDQuery1.Params.ParamByName('vGJDQ').Value :='CHN';
    FDQuery1.Params.ParamByName('vXM').Value :='郭龙生';
    FDQuery1.Params.ParamByName('vCSRQ').Value :='19920501';
    FDQuery1.Params.ParamByName('vXB').Value :='1';
    FDQuery1.ExecSQL;    这种写法数据库里 ’XM‘ 字段 显示正常-’张三‘。
说明: 原项目是用的第一种写法,给后面整个 value()里的值做为一个 string 参数 传进来写库,字段较多,转换成第二种写法较麻烦,第二个就是不明白这两种写法有什么区别,为什么会乱码,想知道原因,劳烦各路神仙,在此叩谢!!!

解决方案 »

  1.   

    这个应该是Oracle客户端的字符集和Oracle服务器的字符集不一致造成的。
    可参考以下下面的连接:https://wenku.baidu.com/view/bceef569e97101f69e3143323968011ca200f748.html?re=viewhttp://www.it610.com/article/4656104.htm
      

  2.   

        FDQuery1.Params.ParamByName('vGJDQ').Value :='CHN';
        FDQuery1.Params.ParamByName('vXM').Value :='郭龙生';
        FDQuery1.Params.ParamByName('vCSRQ').Value :='19920501';
        FDQuery1.Params.ParamByName('vXB').Value :='1';
    这些Value在服务器中未必识别为String
    可能生成如下SQL代码:INSERT INTO  T_SBXX (GJDQ,XM,CSRQ,XB)  VALUES(CHN,郭龙生,19920501,1)而'INSERT INTO  T_SBXX (GJDQ,XM,CSRQ,XB)  VALUES(''CHN'',''张三'',''19920501'',''1'')‘;这一句的,肯定是字符串
    你的第二种方式竟然能执行通过???
    我觉得乌龟壳的语法也不是很严谨
      

  3.   

        FDQuery1.Params.ParamByName('vGJDQ').Value :='CHN';
        FDQuery1.Params.ParamByName('vXM').Value :='郭龙生';
        FDQuery1.Params.ParamByName('vCSRQ').Value :='19920501';
        FDQuery1.Params.ParamByName('vXB').Value :='1';正确的写法应该是:
        FDQuery1.Params.ParamByName('vGJDQ').Value :=QuotedStr('CHN');
        FDQuery1.Params.ParamByName('vXM').Value :=QuotedStr('郭龙生');
        FDQuery1.Params.ParamByName('vCSRQ').Value :=QuotedStr('19920501');
        FDQuery1.Params.ParamByName('vXB').Value :=QuotedStr('1');
      

  4.   

    或者应该先指定一下类型吧?为什么我的赋值语句不能加.Params,加上会编译不过去?
    dm1.FDQ1.ParamByName('业务量折算得分').Value := LabeledEdit4.Text;
    dm1.FDQ1.ParamByName('工资编号').Value := Edit5.Text;
      

  5.   

    dm1.fdq3.execsql('update 登录表 set 状态=:状态 where 工号=:工号',['1在线',qgh]);
    这样写应该问题不大吧,我的是sql server
      

  6.   


    你加了params会报错?你用的不是FDQuery这个组件吧
    SQL没测试过,应该不会乱码,就是Oracle 乱码。
      

  7.   

    方法一修改为:
    FDQuery1.SQL.Text:=Format('INSERT INTO  T_SBXX (GJDQ,XM,CSRQ,XB)  VALUES(%s , %s , %s , %s)',
                                [QuotedStr('CHN'),QuotedStr('张三'),QuotedStr('19920501'),QuotedStr('1')]);
      

  8.   

     FDQuery1.SQL.Text:='INSERT INTO  T_SBXX (GJDQ,XM,CSRQ,XB)  VALUES(''CHN'',N''张三'',''19920501'',''1'')‘;注意, 张三前面加了一个   N, 这样试一下
      

  9.   

    设置FDConnection的Params的CharacterSet为AL16UTF16,不要在Params下面的CharacterSet里输入,这里保持cs_NLS_LANG_(设置为csUTF8也可能正常,但是不能保证),点Params那行右边的...按钮,在弹出的编辑器里输入,或者用代码设置:FDConnection1.Params.Values['CharacterSet'] := 'AL16UTF16';
    在N年前,Borland就有文章说过,尽量用参数化SQL,不要自己拼接SQL串,直接写在SQL中的字符型字段值其编码可能与DMBS对它的理解不一致
      

  10.   

        qry_update.Params.ParamByName('vxm').DataType:=ftString;   //这样插入中文就不会乱码
        qry_update.ParamByName('vxm').Value :=Trim(EXM.Text);
      

  11.   

    con1.Params.Add('CharacterSet=utf8');  //连接11g 时,加下这个试试