mysql和北京有仇吗?

#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