如题。我现在在使用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 “%中文%”,但是都是一样在远端服务器上没查询出结果来。
而在我本地电脑上去完全可以运行。具体原因是什么?恳请大牛指点一下。谢谢。
在本地建立数据库,建立本地网站,使用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 “%中文%”,但是都是一样在远端服务器上没查询出结果来。
而在我本地电脑上去完全可以运行。具体原因是什么?恳请大牛指点一下。谢谢。
如果也是 gb2312则在你的PHP中执行查询前先mysql_query("set names 'gb2312'")
然后在php的连接数据库部分,查询前先发送 “set names '你php的页面编码'”即可
我在原帖中说了,在本地机器上运行时完全没有问题的。但是上传到远程服务器就不行了。另外,远程服务器的数据库是将本地数据库使用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. 但是在本地服务器上运行又完全没有问题。
还请大侠多多指点,谢谢
select * from btinfo where name_cn like “%中文%”
这个命令你是在哪里执行的?而实际上数据库中有符合条件的数据。---你确定看到远程数据库的记录是正常的(不是看本地的)?
| 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等方式,但是远程服务器我没有管理权限,所以没法安装,所以比较郁闷。有什么推荐方面吗?谢谢
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的页面编码'”即可”测试了没有?
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
在本地数据库中查询结构可以正常显示,是没问题的。
而在远端服务器上面,也是可以正常显示中文的。但是使用 like "%中文%" 在服务器上查询就没返回结果了。在查询前已经发送了 set names "gb2312" 编码了。
改成 set names "UTF8" 试下看看