MySQL实现用拼音搜索中文的数据库实现
ec3y
9年前
1、创建表:
CREATE TABLE IF NOT EXISTS `t_base_pinyin` ( `pin_yin_` VARCHAR (255) CHARACTER SET gbk NOT NULL, `code_` INT (11) NOT NULL, PRIMARY KEY (`code_`) ) ENGINE = INNODB DEFAULT CHARSET = latin1;
2、插入数据:
INSERT INTO t_base_pinyin (pin_yin_, code_) VALUES ("a", 20319), ("ai", 20317), ("an", 20304), ("ang", 20295), ("ao", 20292), ("ba", 20283), ("bai", 20265), ("ban", 20257), ("bang", 20242), ("bao", 20230), ("bei", 20051), ("ben", 20036), ("beng", 20032), ("bi", 20026), ("bian", 20002), ("biao", 19990), ("bie", 19986), ("bin", 19982), ("bing", 19976), ("bo", 19805), ("bu", 19784), ("ca", 19775), ("cai", 19774), ("can", 19763), ("cang", 19756), ("cao", 19751), ("ce", 19746), ("ceng", 19741), ("cha", 19739), ("chai", 19728), ("chan", 19725), ("chang", 19715), ("chao", 19540), ("che", 19531), ("chen", 19525), ("cheng", 19515), ("chi", 19500), ("chong", 19484), ("chou", 19479), ("chu", 19467), ("chuai", 19289), ("chuan", 19288), ("chuang", 19281), ("chui", 19275), ("chun", 19270), ("chuo", 19263), ("ci", 19261), ("cong", 19249), ("cou", 19243), ("cu", 19242), ("cuan", 19238), ("cui", 19235), ("cun", 19227), ("cuo", 19224), ("da", 19218), ("dai", 19212), ("dan", 19038), ("dang", 19023), ("dao", 19018), ("de", 19006), ("deng", 19003), ("di", 18996), ("dian", 18977), ("diao", 18961), ("die", 18952), ("ding", 18783), ("diu", 18774), ("dong", 18773), ("dou", 18763), ("du", 18756), ("duan", 18741), ("dui", 18735), ("dun", 18731), ("duo", 18722), ("e", 18710), ("en", 18697), ("er", 18696), ("fa", 18526), ("fan", 18518), ("fang", 18501), ("fei", 18490), ("fen", 18478), ("feng", 18463), ("fo", 18448), ("fou", 18447), ("fu", 18446), ("ga", 18239), ("gai", 18237), ("gan", 18231), ("gang", 18220), ("gao", 18211), ("ge", 18201), ("gei", 18184), ("gen", 18183), ("geng", 18181), ("gong", 18012), ("gou", 17997), ("gu", 17988), ("gua", 17970), ("guai", 17964), ("guan", 17961), ("guang", 17950), ("gui", 17947), ("gun", 17931), ("guo", 17928), ("ha", 17922), ("hai", 17759), ("han", 17752), ("hang", 17733), ("hao", 17730), ("he", 17721), ("hei", 17703), ("hen", 17701), ("heng", 17697), ("hong", 17692), ("hou", 17683), ("hu", 17676), ("hua", 17496), ("huai", 17487), ("huan", 17482), ("huang", 17468), ("hui", 17454), ("hun", 17433), ("huo", 17427), ("ji", 17417), ("jia", 17202), ("jian", 17185), ("jiang", 16983), ("jiao", 16970), ("jie", 16942), ("jin", 16915), ("jing", 16733), ("jiong", 16708), ("jiu", 16706), ("ju", 16689), ("juan", 16664), ("jue", 16657), ("jun", 16647), ("ka", 16474), ("kai", 16470), ("kan", 16465), ("kang", 16459), ("kao", 16452), ("ke", 16448), ("ken", 16433), ("keng", 16429), ("kong", 16427), ("kou", 16423), ("ku", 16419), ("kua", 16412), ("kuai", 16407), ("kuan", 16403), ("kuang", 16401), ("kui", 16393), ("kun", 16220), ("kuo", 16216), ("la", 16212), ("lai", 16205), ("lan", 16202), ("lang", 16187), ("lao", 16180), ("le", 16171), ("lei", 16169), ("leng", 16158), ("li", 16155), ("lia", 15959), ("lian", 15958), ("liang", 15944), ("liao", 15933), ("lie", 15920), ("lin", 15915), ("ling", 15903), ("liu", 15889), ("long", 15878), ("lou", 15707), ("lu", 15701), ("lv", 15681), ("luan", 15667), ("lue", 15661), ("lun", 15659), ("luo", 15652), ("ma", 15640), ("mai", 15631), ("man", 15625), ("mang", 15454), ("mao", 15448), ("me", 15436), ("mei", 15435), ("men", 15419), ("meng", 15416), ("mi", 15408), ("mian", 15394), ("miao", 15385), ("mie", 15377), ("min", 15375), ("ming", 15369), ("miu", 15363), ("mo", 15362), ("mou", 15183), ("mu", 15180), ("na", 15165), ("nai", 15158), ("nan", 15153), ("nang", 15150), ("nao", 15149), ("ne", 15144), ("nei", 15143), ("nen", 15141), ("neng", 15140), ("ni", 15139), ("nian", 15128), ("niang", 15121), ("niao", 15119), ("nie", 15117), ("nin", 15110), ("ning", 15109), ("niu", 14941), ("nong", 14937), ("nu", 14933), ("nv", 14930), ("nuan", 14929), ("nue", 14928), ("nuo", 14926), ("o", 14922), ("ou", 14921), ("pa", 14914), ("pai", 14908), ("pan", 14902), ("pang", 14894), ("pao", 14889), ("pei", 14882), ("pen", 14873), ("peng", 14871), ("pi", 14857), ("pian", 14678), ("piao", 14674), ("pie", 14670), ("pin", 14668), ("ping", 14663), ("po", 14654), ("pu", 14645), ("qi", 14630), ("qia", 14594), ("qian", 14429), ("qiang", 14407), ("qiao", 14399), ("qie", 14384), ("qin", 14379), ("qing", 14368), ("qiong", 14355), ("qiu", 14353), ("qu", 14345), ("quan", 14170), ("que", 14159), ("qun", 14151), ("ran", 14149), ("rang", 14145), ("rao", 14140), ("re", 14137), ("ren", 14135), ("reng", 14125), ("ri", 14123), ("rong", 14122), ("rou", 14112), ("ru", 14109), ("ruan", 14099), ("rui", 14097), ("run", 14094), ("ruo", 14092), ("sa", 14090), ("sai", 14087), ("san", 14083), ("sang", 13917), ("sao", 13914), ("se", 13910), ("sen", 13907), ("seng", 13906), ("sha", 13905), ("shai", 13896), ("shan", 13894), ("shang", 13878), ("shao", 13870), ("she", 13859), ("shen", 13847), ("sheng", 13831), ("shi", 13658), ("shou", 13611), ("shu", 13601), ("shua", 13406), ("shuai", 13404), ("shuan", 13400), ("shuang", 13398), ("shui", 13395), ("shun", 13391), ("shuo", 13387), ("si", 13383), ("song", 13367), ("sou", 13359), ("su", 13356), ("suan", 13343), ("sui", 13340), ("sun", 13329), ("suo", 13326), ("ta", 13318), ("tai", 13147), ("tan", 13138), ("tang", 13120), ("tao", 13107), ("te", 13096), ("teng", 13095), ("ti", 13091), ("tian", 13076), ("tiao", 13068), ("tie", 13063), ("ting", 13060), ("tong", 12888), ("tou", 12875), ("tu", 12871), ("tuan", 12860), ("tui", 12858), ("tun", 12852), ("tuo", 12849), ("wa", 12838), ("wai", 12831), ("wan", 12829), ("wang", 12812), ("wei", 12802), ("wen", 12607), ("weng", 12597), ("wo", 12594), ("wu", 12585), ("xi", 12556), ("xia", 12359), ("xian", 12346), ("xiang", 12320), ("xiao", 12300), ("xie", 12120), ("xin", 12099), ("xing", 12089), ("xiong", 12074), ("xiu", 12067), ("xu", 12058), ("xuan", 12039), ("xue", 11867), ("xun", 11861), ("ya", 11847), ("yan", 11831), ("yang", 11798), ("yao", 11781), ("ye", 11604), ("yi", 11589), ("yin", 11536), ("ying", 11358), ("yo", 11340), ("yong", 11339), ("you", 11324), ("yu", 11303), ("yuan", 11097), ("yue", 11077), ("yun", 11067), ("za", 11055), ("zai", 11052), ("zan", 11045), ("zang", 11041), ("zao", 11038), ("ze", 11024), ("zei", 11020), ("zen", 11019), ("zeng", 11018), ("zha", 11014), ("zhai", 10838), ("zhan", 10832), ("zhang", 10815), ("zhao", 10800), ("zhe", 10790), ("zhen", 10780), ("zheng", 10764), ("zhi", 10587), ("zhong", 10544), ("zhou", 10533), ("zhu", 10519), ("zhua", 10331), ("zhuai", 10329), ("zhuan", 10328), ("zhuang", 10322), ("zhui", 10315), ("zhun", 10309), ("zhuo", 10307), ("zi", 10296), ("zong", 10281), ("zou", 10274), ("zu", 10270), ("zuan", 10262), ("zui", 10260), ("zun", 10256), ("zuo", 10254);
3、创建函数:
DROP FUNCTION IF EXISTS to_pinyin; DELIMITER $ CREATE FUNCTION to_pinyin(NAME VARCHAR(255) CHARSET gbk) RETURNS VARCHAR(255) CHARSET gbk BEGIN DECLARE mycode INT; DECLARE tmp_lcode VARCHAR(2) CHARSET gbk; DECLARE lcode INT; DECLARE tmp_rcode VARCHAR(2) CHARSET gbk; DECLARE rcode INT; DECLARE mypy VARCHAR(255) CHARSET gbk DEFAULT ''; DECLARE lp INT; SET mycode = 0; SET lp = 1; SET NAME = HEX(NAME); WHILE lp < LENGTH(NAME) DO SET tmp_lcode = SUBSTRING(NAME, lp, 2); SET lcode = CAST(ASCII(UNHEX(tmp_lcode)) AS UNSIGNED); SET tmp_rcode = SUBSTRING(NAME, lp + 2, 2); SET rcode = CAST(ASCII(UNHEX(tmp_rcode)) AS UNSIGNED); IF lcode > 128 THEN SET mycode =65536 - lcode * 256 - rcode ; SELECT CONCAT(mypy,pin_yin_) INTO mypy FROM t_base_pinyin WHERE CODE_ >= ABS(mycode) ORDER BY CODE_ ASC LIMIT 1; SET lp = lp + 4; ELSE SET mypy = CONCAT(mypy,CHAR(CAST(ASCII(UNHEX(SUBSTRING(NAME, lp, 2))) AS UNSIGNED))); SET lp = lp + 2; END IF; END WHILE; RETURN LOWER(mypy); END; $ DELIMITER ;
4、创建视图:
CREATE VIEW v_pinyin AS SELECT u.id, to_pinyin (u.displayname) AS pinyin, u.displayName FROM wsm_userinfo u