如题。我现在在使用PHP编写个网页,其中用到了MYsql数据库的like语句。
在本地建立数据库,建立本地网站,使用like查询完全没有问题。但是上传到远端主机就会产生问题:使用like进行中文查询,会查不出来或者误差较大。
具体来说如下:
1. create table btinfo(
    id int(20) unsigned NOT NULL auto_increment ,
    presentation varchar(100),
    name_cn  varchar(60) binary,
    PRIMARY KEY(id)
)
TYPE=MyISAM, default character set gb2312; 
以上述方式建立数据库,其中binary是后来看网上资料加上去的,但是 在随后的查询中,使用select * from btinfo where name_cn like “%中文%”,却查询结果为零,而实际上数据库中有符合条件的数据。
另外,我还使用过select * from btinfo where binary name_cn like “%中文%”,
或者select * from btinfo where name_cn like binary “%中文%”,但是都是一样在远端服务器上没查询出结果来。
而在我本地电脑上去完全可以运行。具体原因是什么?恳请大牛指点一下。谢谢。

解决方案 »

  1.   

    字符集的问题。你主机上这个表的字符集设置是什么?
    如果也是 gb2312则在你的PHP中执行查询前先mysql_query("set names 'gb2312'")
      

  2.   

    字符集设置问题看看PHP的编码是什么
    然后在php的连接数据库部分,查询前先发送 “set names '你php的页面编码'”即可
      

  3.   

    谢谢楼上两位大侠。
    我在原帖中说了,在本地机器上运行时完全没有问题的。但是上传到远程服务器就不行了。另外,远程服务器的数据库是将本地数据库使用mysqldump函数直接导出为a.sql文件,然后上传到远程主机再导入的。这个a.sql文件其中每个表格的格式如下:
    DROP TABLE IF EXISTS `btinfo`;
    SET @saved_cs_client     = @@character_set_client;
    SET character_set_client = utf8;
    CREATE TABLE `btinfo` (
      `bt_id` int(20) unsigned NOT NULL AUTO_INCREMENT,
      `name_cn` varchar(60) CHARACTER SET gb2312 COLLATE gb2312_bin DEFAULT NULL,
      `name_en` varchar(60) CHARACTER SET gb2312 COLLATE gb2312_bin DEFAULT NULL,
      PRIMARY KEY (`bt_id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=592 DEFAULT CHARSET=gb2312;
    SET character_set_client = @saved_cs_client;
    不知道为什么里面仍然有utf8. 但是在本地服务器上运行又完全没有问题。
    还请大侠多多指点,谢谢
      

  4.   

    贴出下面命令结果:show variables like '%char%';另外,你说的:
    select * from btinfo where name_cn like “%中文%”
    这个命令你是在哪里执行的?而实际上数据库中有符合条件的数据。---你确定看到远程数据库的记录是正常的(不是看本地的)?
      

  5.   

    我在本地机器上的查询结果为:
    | Variable_name            | Value                               |
    +--------------------------+-------------------------------------+
    | character_set_client     | gb2312                              |
    | character_set_connection | gb2312                              |
    | character_set_database   | gb2312                              |
    | character_set_filesystem | binary                              |
    | character_set_results    | gb2312                              |
    | character_set_server     | gb2312                              |
    | character_set_system     | utf8                                |
    | character_sets_dir       | D:\MySQL Server 5.1\share\charsets\ |
    在远程数据库上的查询结果为:
    character_set_client      gbk 
    character_set_connection   latin1 
    character_set_database    latin1 
    character_set_filesystem   binary 
    character_set_results    gbk 
    character_set_server   latin1 
    character_set_system   utf8 
    character_sets_dir     G:\mysql\share\charsets\ 
    不知道该怎么修改?谢谢。 另外远程数据库中的确是有符合条件的数据的。不是本地数据库我也搜索网上资料了,看到说这种搜索方式效率低,推荐使用 scws等方式,但是远程服务器我没有管理权限,所以没法安装,所以比较郁闷。有什么推荐方面吗?谢谢
      

  6.   

    在远程数据库上的查询结果为: 
    character_set_client      gbk 
    character_set_connection  latin1 
    character_set_database    latin1 
    character_set_filesystem  binary 
    character_set_results    gbk 

    character_set_server  latin1 
    character_set_system  utf8 
    character_sets_dir    G:\mysql\share\charsets\ 
    不知道该怎么修改?谢谢。 另外远程数据库中的确是有符合条件的数据的。你上面所说的“远程数据库中有符合条件的数据”,即中文能正常显示的,你是用什么看到的?
    还有,你php页面返回不了正常的结果,你作了前面所说的“然后在php的连接数据库部分,查询前先发送 “set names '你php的页面编码'”即可”测试了没有?
      

  7.   

    这个是我在php页面中关于字体编码的设置:
    <meta http-equiv="Content-Language" content="zh-cn">
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    在本地数据库中查询结构可以正常显示,是没问题的。
    而在远端服务器上面,也是可以正常显示中文的。但是使用 like "%中文%" 在服务器上查询就没返回结果了。在查询前已经发送了 set names "gb2312" 编码了。
      

  8.   

    在查询前已经发送了 set names "gb2312" 编码了。------------->
    改成 set names "UTF8" 试下看看
      

  9.   

    搞定了。 在查询的时间添加了 binary ,就好用了。谢谢楼上的各位,开始散分。