mysql 中的奇葩问题:NAME_CONST 


本人在一次项目开发中 ,开发了一个sp .这个sp 很简单 ,就是表的内连接 ,
然后将数据展现出来 .


代码如下:
delimiter $$


create procedure  sp_dkh_single() begin


 set @m=0;
 set @1=0;
select A.tel,B.dkhid
 from (
select m() mid,tel from temp02 where dkhid='') A
inner join 
(select mo() as id,dkhid  from tmp_dkh  order by dkhid) B
on A.mid=B.id


end  ;
$$ delimiter ;


就是这么一个简单的sp,但是展现的结果始终有问题
dkhid列始终未为空


然后是在没办法了,我就使用 show full PROCESSLIST
看一下这个mysql服务是怎么执行这个sp的,然后我就发现问题了。


mysql 服务执行的sp 如下 :
select A.tel,B.dkhid
 from (
select m() mid,tel from temp02 where temp02.dkhid='') A
inner join 
(select mo() as id,  NAME_CONST('dkhid',_utf8'' COLLATE 'utf8_general_ci')  from tmp_dkh  
order by NAME_CONST('dkhid',_utf8'' COLLATE 'utf8_general_ci')) B
on A.mid=B.id  


问题出在name_const上,name_const是系统加上的。


之后我把sp修改了下 


代码如下:
delimiter $$


create procedure  sp_dkh_single() begin


 set @m=0;
 set @1=0;
select A.tel,B.dkhid
 from (
select m() mid,temp02.tel from temp02 where temp02.dkhid='') A
inner join 
(select mo() as id,tmp_dkh.dkhid  from tmp_dkh  order by tmp_dkh.dkhid) B
on A.mid=B.id


end  ;
$$ delimiter ;


就正常了 ,mysql服务没有自动添加name_const,执行正常,结果正确。

 

个人猜测:估计是解析器无法正确识别单个字段的字符集,所以在字段前面加上添加上表明就ok了