zoukankan      html  css  js  c++  java
  • php/Mysql汉字按拼音首字母检索

    实现按汉字拼音首字母检索数据,具体实现方法详见下面示例。

    首先建一个拼音表 t_cosler ,存放每个字母开头的第一个汉字的编号和最后一个汉字的编号,每次取姓名的第一个汉字然后去跟编码表匹配:

    --
    -- 表的结构 `tcosler`
    --
    
    CREATE TABLE IF NOT EXISTS `tcosler` (
      `fPY` char(1) NOT NULL,
      `cBegin` int(11) NOT NULL,
      `cEnd` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;

    然后插入编码数据: 

    --
    -- 转存表中的数据 `tcosler`
    --
    
    INSERT INTO `tcosler` (`fPY`, `cBegin`, `cEnd`) 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),
    ('a', 97, 97),
    ('b', 98, 98),
    ('c', 99, 99),
    ('d', 100, 100),
    ('e', 101, 101),
    ('f', 102, 102),
    ('g', 103, 103),
    ('h', 104, 104),
    ('i', 105, 105),
    ('j', 106, 106),
    ('k', 107, 107),
    ('l', 108, 108),
    ('m', 109, 109),
    ('n', 110, 110),
    ('o', 111, 111),
    ('p', 112, 112),
    ('q', 113, 113),
    ('r', 114, 114),
    ('s', 115, 115),
    ('t', 116, 116),
    ('u', 117, 117),
    ('v', 118, 118),
    ('w', 119, 119),
    ('x', 120, 120),
    ('y', 121, 121),
    ('z', 122, 122),
    ('A', 65, 65),
    ('B', 66, 66),
    ('C', 67, 67),
    ('D', 68, 68),
    ('E', 69, 69),
    ('F', 70, 70),
    ('G', 71, 71),
    ('H', 72, 72),
    ('I', 73, 73),
    ('J', 74, 74),
    ('K', 75, 75),
    ('L', 76, 76),
    ('M', 77, 77),
    ('N', 78, 78),
    ('O', 79, 79),
    ('P', 80, 80),
    ('Q', 81, 81),
    ('R', 82, 82),
    ('S', 83, 83),
    ('T', 84, 84),
    ('U', 85, 85),
    ('V', 86, 86),
    ('W', 87, 87),
    ('X', 88, 88),
    ('Y', 89, 89),
    ('Z', 90, 90),
    ('0', 48, 48),
    ('1', 49, 49),
    ('2', 50, 50),
    ('3', 51, 51),
    ('4', 52, 52),
    ('5', 53, 53),
    ('6', 54, 54),
    ('7', 55, 55),
    ('8', 56, 56),
    ('9', 57, 57);
    

    注意:此表是按gbk编码的字母范围对照表,而刚才建表的的时候用到的是utf-8的编码方式,由于没找到utf-8的编码表,所以只能上这个,一会写sql查询的时候需要做个编码转换(这个问题好久才发现的,好多帖子都没写编码方式,直接导致查询结果为空),当然如果你要检索的汉字是gbk编码的,那么直接查询即可

    然后呢,就可以写sql语句查询啦...、、、、

    比如你要查以F开头的汉字,假设你的汉字存在users表里的userName字段里,那么sql就是:

    SELECT p. * , c. * 
           FROM users p, tcosler c
           WHERE CONV( HEX( LEFT( CONVERT( userName
           USING gbk ) , 1 ) ) , 16, 10 ) 
           BETWEEN c.cBegin
           AND c.cEnd
           AND fPY = 'F'
    

    解释一下:CONVERT是将userName转换成gbk编码(上面已经解释过了),如果你本来就是gbk编码的汉字,那CONVERT这个就可以省略了

    LEFT("",1)是取第一个汉字,HEX是把汉字转换成16进制编码数,CONV("",16,10)就是把16进制转换成10进制,

    整个过程就是:将汉字编码改为gbk,然后取第一个汉字,然后把这个汉字转换成16进制编码,然后把16进制转换成10进制,这样就可以在编码表里查询了(编码表存的明显是10进制)

     

  • 相关阅读:
    Visual Basic 9.0 前沿播报·静态篇(二)对象初始化器和匿名类型
    Visual Basic 9.0 前沿播报内容概览
    Refactor! for VB —— VB2005的重构支持(一)
    我不知道该说什么,这里太先进了!
    Visual Basic 9.0 前沿播报·静态篇(一)局部变量类型推测和数组初始化器
    关于“就地颠倒句子里的词”面试题
    Visual Basic 9.0 前沿播报·静态篇(三)扩展方法
    《窝窝世界》视频20101025
    Silverlight 游戏开发小技巧:透明背景的Silverlight程序
    Silverlight 游戏开发小技巧:技能冷却效果2(Cooldown)2
  • 原文地址:https://www.cnblogs.com/swinm/p/3385184.html
Copyright © 2011-2022 走看看