寻找让mysql5正确执行 INSERT INTO test VALUES ('運\'); INSERT INTO test VALUES ('運\\');

解决方案 »

  1.   

    尝试使用 mysql_real_escape_string 转义鉴于其他应用项目的约束,目前还只能使用mysql4.0.20
      

  2.   

    改成 運\\
    在mysql40里报错,在mysql5里写入的是運\
      

  3.   

    而且软件不可能因为换了个版本的mysql就跟着变一次吧。我看别人有些mysql5一样用dz论坛好好的。在安装mysql5上肯定有问题。一定是有办法安装mysql5让他可以正确运行
    INSERT INTO test VALUES ('運\'); 
      

  4.   

    我得说清楚一点。'運'字的ascii码后一半是字符'/'
    所以在写入mysql时会被替换成'運/',这是正确的。
    如果直接写'運'的话在mysql40里会报错。
      

  5.   

    也可以在php里试试看,以下语句是会报错的。echo '運';
      

  6.   

    所以有问题的不是语句,而是mysql5。我试了很多版本的mysql都未能解决这个问题。请有此类经验的朋友提点一下。
      

  7.   

    试试用stripcslashes看能不能去掉这个
      

  8.   

    不能用语句来改。请大家测试一下自己装的mysql5。INSERT INTO test VALUES ('運\'); 这个写法是肯定没错的。从mysqldump倒出来的数据也是这样写。如果要改语句那适用性和工作量都太恐怖了。
      

  9.   

    请装一个mysql41以上的版本。只要能写入
    INSERT INTO test VALUES ('運\'); 
    而不乱码。我用样的版本步骤通过的话,200分立即送上。
      

  10.   

    我刚刚试过了,没有出现你说的情况
    环境,win32,php5,mysql5.0x
      

  11.   

    输入的变量我没有用addslashes来处理,在输出sql语句的时候发现被自动处理了,下面是sql语句:
    insert into tuser(xxx,yyy) values('運\運\','運\運\')
    insert into tuser(xxx,yyy) values('運\','運\')读取值的时候也没有做任何处理,数据库中,网页显示的都是正常的。
      

  12.   

    请提供php、mysql版本。最好带下载地址和安装流程。通过立即给分。
      

  13.   

    $str = '運';我测试的时候,这样也会报错的。我的环境php5.1.2  Apache2.0.55 windows2000
      

  14.   

    我想,惟一区别可能是mysql5对php5的那三个dll文件
    下载地址:http://dev.mysql.com/downloads/connector/php/
    把odbc也更新一下吧:http://dev.mysql.com/downloads/connector/odbc/3.51.html
      

  15.   

    我是这样测的[test.sql]
    insert into tuser (xxx,yyy) values('運\','運\');
    mysql>use database;
    mysql>\. test.sql应该不关php的事吧?
      

  16.   

    I tried "insert into tuser(xxx,yyy) values('運\','運\')" and failed.
      

  17.   

    Sorry, I tried "INSERT INTO test VALUES ('運\');" in phpmyadmin, and succeeded.
    It insert "運" into db.But when I use php to insert:"$sql = "insert into test values ('運\')";",
    It failed.So I think it is about the problem of charset.
      

  18.   

    $sql="insert into test values ('運\')";当然是failed啦。
    因为php中本身就要转义一次。这样写可以就可以了。
    $sql="insert into test values ('運\\\')";你的mysql版本?如果是4.1以上版本可以提供一下下载地址吗?我在本机已经装过近十个版本了都没有一个能够通过。phpmyadmin里INSERT INTO test VALUES ('運\');全部报错。试了三台机器都一样,我都不知道怎么回事了。
      

  19.   

    我没用过phpmyadmin,我用pb作为数据库开发工具,pb通过myodbc连接的。我执行sql语句是insert into tuser(xxx,yyy) values('運\','運\')
    没有出问题。你的开发环境到底是什么啊?如果是win32,不妨通过myodbc试一下。
      

  20.   

    win32和linux我都用过了,一样的问题。可以把my.ini或my.conf上传一下吗?我已经换了很多版本的mysql了都无效。我想会不会是my.ini的问题?
      

  21.   

    虽然已经在my.ini里加入了default-character-set=gbk
    但我查了一下环境变量发现还是有好几个变量如下,不知道是不是这个原因?
    character_set_system=utf8
    character_set_results=latin1
    character_set_connection=latin1
    collation_connection=latin1_swedish_ci
      

  22.   

    安装的是:mysql-standard-5.0.22-linux-i686我没有设置字符集
      

  23.   

    mysql数据库在字符方面的问题就是多
    我默认安装
    用mysqlfront的最新版本插入记录
    用mysqlfront或者dos下查询记录,中文全乱码
    用delphi编写数据库程序,显示的结果又正确的如果安装的时候选择gb2312
    用mysqlfront的最新版本插入记录
    用mysqlfront或者dos下查询记录,中文正确
    用delphi编写数据库程序,显示的是乱码真不知道如何解决这个问题啊
      

  24.   

    I use mysql 5.0.22-community-nt mysql info from phpmyadmin:character set client      utf8      latin1  
    character set connection  utf8      latin1  
    character set database    latin1    latin1  
    character set filesystem  binary    binary  
    character set results     utf8      latin1  
    character set server      latin1    latin1  
    character set system      utf8      utf8  
      

  25.   

    这不是mysql版本的问题,是字符集的问题
    character_set_system=utf8
    character_set_results=latin1
    character_set_connection=latin1
    collation_connection=latin1_swedish_ci
    默认连接客户端使用的是latin1字符集,这个时候SQL语句应写成
    INSERT INTO test VALUES ('運\');如果客户端使用的是gbk编码,那么sql语句和上面的相同,因为gbk兼容latin的字符集如果使用的是utf8编码,那么不需要加\,
    INSERT INTO test VALUES ('運');即可,utf8中"運"的编码是e9 81 8b不包括"\"的这个字符的码位,此外你的数据库及表对应的编码也会有影响,要注意统一
      

  26.   

    快说到点子上了。我现在的问题是set names gbk;后情况同utf8!!
    用其他语言时是
    INSERT INTO test VALUES ('運\');可是set为gbk或utf8时却都是
    INSERT INTO test VALUES ('運');我就是为了解决这个问题。请帮助。
      

  27.   

    set names gbk;
    后,character_set_system=utf8,其他都是gbk了。但是写入时就是不能加\,以至于我无法将原数据导出的gbk sql导入。
      

  28.   

    稻草人的解释是对的,不过有一个小错误。
    如果客户端使用的是gbk编码,那么sql语句为
    INSERT INTO test VALUES ('運');你必须修改数据库的配置,设置字符集为gbk以下是我的mysql的配置,本地环境,winxp+mysql5.0.22
    mysql> \s
    --------------
    mysql  Ver 14.12 Distrib 5.0.22, for Win32 (ia32)Connection id:          6
    Current database:       co
    Current user:           root@localhost
    SSL:                    Not in use
    Using delimiter:        ;
    Server version:         5.0.22-community-nt
    Protocol version:       10
    Connection:             localhost via TCP/IP
    Server characterset:    gbk
    Db     characterset:    gbk
    Client characterset:    gbk
    Conn.  characterset:    gbk
    TCP port:               3306
    Uptime:                 28 min 20 secThreads: 1  Questions: 65  Slow queries: 0  Opens: 2  Flush tables: 1  Open tabl
    es: 7  Queries per second avg: 0.038
    --------------
    我的my.ini------------------------------
    [mysql]default-character-set=gbk[mysqld]default-character-set=gbk
      

  29.   

    set names gbk后,当然就不能+\了,因为mysql已经当運是一个字符了。
    如果 set names latin1 ,那么mysql将汉字拆开成为一个一个的ascii字符,所以要+\
      

  30.   

    如果gbk不能+\。那以前的数据是否就无法导入了呢?mysql40以前mysqldrump可无法导出为不带\的呀。有很多的汉字都因为编码问题会在后面带上了\。而且addslashes('運')得到的也是带\的。那是不是意味着gbk的页面只能用utf8来写程序?这不合理。
      

  31.   

    我现在需要的是在程序代码用gbk来做页面,要可以正确执行以下代码。$db->query("insert into test values ('".addslashes('運\')."')");总不能在防注入时还要判断里面是不是带有特殊字符,如果有,还要分割处理单独吧?有些人的mysql是可以这样写入的。我希望让我的mysql也这样,该如何设置mysql。我现在只能这样加这个字,这样没办法防sql注入了。
    $db->query("insert into test values ('運\')");
      

  32.   

    把“運”的文件存成utf-8 echo出来就变成“閬”
    说明这个字的编码太奇怪,应该找出编码这个字的人,鞭他一顿
    php解析的时候显然当成 "x\" 了
    它存在隐式转义,php的转义字符默认就是\,如果能把它改成别的就能搞定,不过这不大可能
      

  33.   

    我知道这个字很奇怪。但奇怪的不止是这个字,而是一批这样的字。但是解决办法是肯定有的。比如dz的官方论坛就完全可以发運字。我问了他们也说不出什么,只说是mysql的bug,让我换个版本。我换了十几个版本也未能解决。我在本地mysql5建起来的dz论坛上只要一发标题为運字的帖就sql报错了。
      

  34.   

    现在问题是mysql40以前版本,也是把这个字当成'x\'的,但mysql5里都变成了'X'。这使得程序无法向下(上)兼容。
      

  35.   

    $db->query("insert into test values ('".addslashes('運\')."xxxx')");这样的倒可以写入。mysql5真太奇怪了。'運\xxx'这样的可以识别出来。但'xxxx運\'就会报错。似乎mysql5的\判断是按右边优先级的?
      

  36.   

    兼容set names latin1;
    这样mysql就把字符分割为ascii来处理,就ok了。
      

  37.   

    set names latin1;写入的确是兼容了。但读出来是乱码。
      

  38.   

    我覺得可能是繁體&簡體混用搞成這樣子的
    繁体存成big5或者统一成utf-8就ok了
    到如到处用别的工具,mysql-front之类的,别用pma或者跟php有关的工具
      

  39.   

    我没用别的工具。我用mysql.exe+一个sql文本测试的。结果一样。
    虽然是繁简体混用,但都是gbk编码的范围内。用utf8是无法解决的。如果是从mysql40里导出的gbk数据是无法导入到utf8数据库里的,带有大量的\号啊。
      

  40.   

    过G的sql文件,而且这个\还是在不固定的文字后面。如果采用手工修改sql文件后再导入的方式也不可行。按G算的文本,一个操作都得几分钟。
      

  41.   

    读出来是乱码
    这个我倒没验证,个人看法,读出来的时候set names gbk,应该就ok了。
      

  42.   

    试过了,读出来时set names gbk;写入为latin1时读出'?/'
    写入为gb2312时读出'哕'