本文主题:汉语拼音字母ASCII范围,实现首字母搜索功能
背景:风风火火,两天将整个名片系统所有接口写完后
公司更改了需求,要求名片搜索不但有搜索姓名手机号职位功能还要加上姓名首字母搜索功能
思来想去,这个难度有点大啊,就想到能不能用ASCII码来实现,发现PHP中有个ord()函数可以返回ASCII码值,转念一想,要是mysql中也有ord()函数这样的功能函数的话,那就很nice了,试了一下还真有,连名字都一样,真的很nice。废话不多说,下面开始我的分享:
- 数据库代码
所用到表:user_cards(用户表),initial_search(字母范围搜索表)
CREATE TABLE IF NOT EXISTS `initial_search` (
`inputLe` char(1) NOT NULL COMMENT '需转码的字母',
`transcodeBegin` int(11) NOT NULL COMMENT '转码范围开始',
`transcodeEnd` int(11) NOT NULL COMMENT '转码范围结束'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 搜索代码:
SELECT uc. * , inits. *
FROM user_cards uc, initial_search inits
WHERE CONV( HEX( LEFT( CONVERT( userName
USING gbk ) , 1 ) ) , 16, 10 )
BETWEEN inits.transcodeBegin
AND inits.transcodeEnd
AND inputLe = '$key' "
- 下面来看具体原理:利用ASCII码值和16进制与10进制的转换实现
- 一下即是汉语拼音字母ASCII范围也是搜索表的值
INSERT INTO `initial_search` (`inputLe`, `transcodeBegin`, `transcodeEnd`) VALUES
('A', 45217, 45252),
('B', 45253, 45760),
('C', 45761, 46317),
('D', 46318, 46825),
('E', 46826, 47009),
('F', 47010, 47296),
('G', 47297, 47613),
('H', 47614, 48118),
('J', 48119, 49061),
('K', 49062, 49323),
('L', 49324, 49895),
('M', 49896, 50370),
('N', 50371, 50613),
('O', 50614, 50621),
('P', 50622, 50905),
('Q', 50906, 51386),
('R', 51387, 51445),
('S', 51446, 52217),
('T', 52218, 52697),
('W', 52698, 52979),
('X', 52980, 53640),
('Y', 53689, 54480),
('Z', 54481, 55289);