mysql和北京有仇吗?
发布于:2022-01-17 09:50:54
#1 虞飞
在ecshop的表ecs_region里,想查找一个北京的地区代码,mysql语句如下:
SELECT region_id FROM ecs_region WHERE region_name = '北京' and region_type = 1
结果打死查不出来结果,在客户端里把英文单引号,删除一下再添上,再执行,就可以查到,如果是通过PHP程序生成的SQL语句,就是不行,查不出来。
后来加上binary关键字也不行。
SELECT region_id FROM ecs_region WHERE region_name = binary('{$province}') and region_type = 1
但将省份名称改成其他省,如安徽,就可以查到。
也不是因为北京是直辖市,市级单位还有一个北京,会形成数组的问题,已经通过region_type = 1去除了这种可能性,答案只有一个。
是因为mysql和北京有仇吗?晕死我了。
该贴已经同步到 虞飞的微博
2011-09-30 02:43:19
#2 虞飞
排除一切拼写问题,也不要问记录是否存在,记录第二条就是北京。
请大家帮忙想想看到底是什么可能性?
PHP版本:5.2.17
Mysql版本:5.1.56
操作系统:RHEL
2011-09-30 02:46:15
#3 jake
编码看看。GBK和UTF8看起来一样却是不同的。
2011-09-30 08:47:49
#4 虞飞
这个问题实在头痛,无心中,用mb_strlen和strlen测试了下代表这个北京的变量的长度。mb_strlen报3,strlen报9,UTF-8编码一个汉字用3字节,这两个结果是对应的,可是问题出来了,那一个字节在哪里呢?用肉眼是看不出来的,测试了该变量的字符集,也是UTF-8,用trim函数去过一些空白字符了,也依旧如此。
代码发在下面,请大家帮忙看看,那一个字节到底出在哪里。
$address = explode(':',$res[$x]['ship_area']); //这个是从数据集里取出ECshop的地址,并用英文冒号分隔成一个数组
$district = $address[2]; //将区的代号从数组中取出。
$addr = explode('/',$address[1]); //将详细的省市区三级单位从数组中的第二项取出,并用斜杠分隔成数组。
$pi = strpos($addr[0],'省'); //如果省级单位的名称中含“省”字,则去除。
if ($pi >= 0) {
$province = trim(str_replace("省","",$addr[0]));
} else {
$province = trim($addr[0]);
}
2011-10-08 03:01:35
#5 jake
最好直接从数据库里面读出来就进行mb_strlen的对比,不要经过“去除省字”这样的处理。解决问题要从根本上出发,而不是一直在怀疑和想象。
2011-10-08 08:45:09
#6 虞飞
不试试怎么知道问题在哪里啊。我后来试过了,直接从数据库里读取出来
北京/北京市/海淀区
按照UTF-8一个汉字三个字节来计算,strlen应该是26个字节,结果一开始strlen就是29字节。
有什么办法能去除这个隐形的一个字节呢。
2011-10-08 15:55:53
#7 anythink
得是多空格了?
2011-10-08 16:30:47
#8 jake
找出为什么多一个字节就行了
2011-10-08 20:14:57
#9 虞飞
得是多空格了?
anythink 发表于 2011-10-8 16:30 
肉眼看,没有,用选择拖黑的方式看,没有,用trim去除,无效,不知道还有什么可能性
2011-10-10 00:39:17
#10 虞飞
找出为什么多一个字节就行了
jake 发表于 2011-10-8 20:14 
就是找不出啊,这才郁闷呢。页面也不存在BOM问题。
2011-10-10 00:39:58
#11 jake
肉眼看,没有,用选择拖黑的方式看,没有,用trim去除,无效,不知道还有什么可能性 ...
虞飞 发表于 2011-10-10 00:39 
或许有个回车,这样要在phpmyadmin之类的工具里面看才行。
2011-10-10 08:51:23
#12 虞飞
在phpmyadmin里面看过的,是类似”北京/北京市/朝阳区“这样子的,后面直接有文字的。明显不像有回车的样子。这个估计是我见过最灵异的事情了。估计jake也是,哈哈。
2011-10-16 00:01:28
#13 redguan
数据库字段内有空格。
2011-10-22 19:41:07