本文主題:漢語(yǔ)拼音字母ASCII范圍,實(shí)現(xiàn)首字母搜索功能
背景:風(fēng)風(fēng)火火,兩天將整個(gè)名片系統(tǒng)所有接口寫(xiě)完后
公司更改了需求,要求名片搜索不但有搜索姓名手機(jī)號(hào)職位功能還要加上姓名首字母搜索功能
思來(lái)想去,這個(gè)難度有點(diǎn)大啊,就想到能不能用ASCII碼來(lái)實(shí)現(xiàn),發(fā)現(xiàn)PHP中有個(gè)ord()函數(shù)可以返回ASCII碼值,轉(zhuǎn)念一想,要是mysql中也有ord()函數(shù)這樣的功能函數(shù)的話,那就很nice了,試了一下還真有,連名字都一樣,真的很nice。廢話不多說(shuō),下面開(kāi)始我的分享:
- 數(shù)據(jù)庫(kù)代碼
所用到表:user_cards(用戶表),initial_search(字母范圍搜索表)
CREATE TABLE IF NOT EXISTS `initial_search` (
`inputLe` char(1) NOT NULL COMMENT '需轉(zhuǎn)碼的字母',
`transcodeBegin` int(11) NOT NULL COMMENT '轉(zhuǎn)碼范圍開(kāi)始',
`transcodeEnd` int(11) NOT NULL COMMENT '轉(zhuǎn)碼范圍結(jié)束'
) 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' "
- 下面來(lái)看具體原理:利用ASCII碼值和16進(jìn)制與10進(jìn)制的轉(zhuǎn)換實(shí)現(xiàn)
- 一下即是漢語(yǔ)拼音字母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);