是这样的,要查询存放 文件名信息的表(file_table),文件名是中文的。可是select
 * from file_table where filename like "%文字%";这个参数是中文的,查询语句取不出
来信息,结果是空。 而且我也试过 set names utf8。请问这个怎么解决? 谢谢牛牛们~

解决方案 »

  1.   

    select * from file_table where locate(filename,'文字')>0;或者select * from file_table where filename like BINARY '%文字%';
      

  2.   

    我的表格内容是乱码的,我尝试过 将表列 alter 成utf8的 结果不成ALTER TABLE ark_dhsm_file CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;   
      

  3.   


    补充我的环境是windows 下mysql
      

  4.   

    select * from file_table where filename like BINARY '%文字%';这样可以。
      

  5.   


    表里面有这样的数据 “1能力.txt” 第一遍我查询 “能力”select filename from file_table where filename like binary '%能力.txt%';
    Empty set (0.00 sec)第二遍我查询 “1”,结果很多我截取需要的那个结果
    select filename from file_table where filename like binary '%1%';
    +-------------------------------------------------------+
    | filename                                              |
    +-------------------------------------------------------+
    | 1将イ??将ゥ宵゙?.txt                                     |
    +-------------------------------------------------------+
    23 rows in set (0.00 sec)
      

  6.   

    再有的信息是:file_table.filename 列的type是text的,collation改成utf,之前默认的是latin1
      

  7.   

    将字符集修改后要重新UPDATE表中的记录才行。
      

  8.   


    update file_table set filename = '1能力.txt'where id = 1; select结果:
    select filename from ark_dhsm_file where filename like '%1%';
    +-------------------------------------------------------+
    | filename                                              |
    +-------------------------------------------------------+
    | 1???.txt                                              |为什么还是乱码捏?
      

  9.   

    我将文件名给转成十六进制,我想即使乱码,也是现实的问题。 select hex(filename) from ark_dhsm_file;
    +------------------------------------------------------------+
    | hex(filename)                                              |
    +------------------------------------------------------------+
    ...
    36E794B3E8AB8B2E747874    ———————————(1)
    ...
    35 rows in set (0.00 sec)然后又将 需要匹配的文字转成十六进制
    select hex('文字'); //注:该文字我替换了,下面的十六进制码也许和您的得到的不一样,这不是问题的主要原因
    905C90BF                 —————————————(2)我认为(2)的应该可以在(1)中找到,这样就可以匹配着。可这是我一厢情愿,还是没能成功。介个大牛们给分析一下~
      

  10.   

    问题解决了,是这样的,字符匹配时将匹配字符的转成16进制。
    之前应该将数据库的字符集设定成中文字符集,如何设定和调整字符集参见
    http://blog.donews.com/yllr/archive/2007/01/03/1107388.aspx
    存储在表中的数据是不会改变的,这个取决于存储之前的字符设定。1. set names 'gbk' //日文字符是sjis,注意utf8和gbk还有sjis是有区别的
    mysql> set names 'gbk';
    mysql> select HEX(convert('能力' using utf8));
    +---------------------------------+
    | HEX(convert('能力' using utf8)) |
    +---------------------------------+
    | E693BBE6A4A1                    |
    +---------------------------------+
    mysql> set names sjis;
    mysql> select HEX(convert('能力' using utf8));
    +---------------------------------+
    | HEX(convert('能力' using utf8)) |
    +---------------------------------+
    | E883BDE58A9B                    |
    +---------------------------------+
    mysql> select HEX('能力');
    +-------------+
    | HEX('能力') |
    +-------------+
    | 9497CD      |
    +-------------+
    2.将表中的数据转成十六进制,因为我的源表为日文集,以之为例,中文集亦然:
    select hex(filename) from file_table;
    ....
    | 35E68BBFE68D952E747874                                     |
    | 36E794B3E8AB8B2E747874                                     |
    | 31E883BDE58A9B2E747874                                     |
    | 32E4BA88E683B32E747874                                     |
    | 33E7A684E9AB982E747874                                     |
    | 34E6A78BE7AF892E747874                                     |
    .....可以看到1.设定为日文集的十六进制码(E883BDE58A9B),可以在表中匹配着3.因此总的sql为mysql>set names 'gbk';
    mysql>select filename from ark_dhsm_file where cast(hex(filename) as char) like concat(‘%’,cast(hex(convert('能力' using utf8))as char),’%’)
    感谢1,6楼的提示,4楼也有帮助。 谢谢大家的回帖,总结一下攒rp,下次再提问会有人回~哈哈