php/Mysql汉字按拼音首字母检索,phpmysql汉字检索
原文链接
实现按汉字拼音首字母检索数据,具体实现方法详见下面示例。
首先建一个拼音表 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;
然后插入编码数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
--
--
转存表中的数据 `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就是:
1 2 3 4 5 6 7 |
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进制)
PHP之友评论