发表新主题 回复该帖子
主题:[转]mysql 根据英文首字母(拼音)来查询汉字函数
jastby
帖子档案  楼主 [转]mysql 根据英文首字母(拼音)来查询汉字函数   Post by : 2009-06-12 12:21:42.0
  • 幼儿园
  • 幼儿园
  • UID:2
  • 主题:126
  • 帖子:219
  • 加为好友 加为好友    发送短信 发送短信

用mysql建立一个函数功能是:英文首字母来查询汉字

比如输入A,把表 tbl 中 字段 f 中以“啊,挨”,等开始的都选取出来

方法一:建一个拼音表 t_cosler ,存放每个字母开头的第一个汉字的编号和最后一个汉字的编号。

+-------+---------+---------+
| f_PY | cBegin | cEnd  |
+------+----------+---------+
|   A    | 
45217 | 45252 |
|   B    | 
45253 | 45760 |
.....
|   Z    | 
54481 | 55289 |
+-----+-----------+---------+

   sql代码
  1. mysql> create table t_cosler(  
  2.     ->  f_PY char primary key,  
  3.     ->  cBegin  SMALLINT UNSIGNED not null,  
  4.     ->  cEnd    SMALLINT UNSIGNED not null 
  5.     -> );  
  6. Query OK, 0 rows affected (0.09 sec)  
  7.  
  8. mysql> insert into t_cosler values 
  9.     -> ('A',0xB0A1,0xB0C4),  
  10.     -> ('B',0xB0C5,0xB2C0),  
  11.     -> ('C',0xB2C1,0xB4ED),  
  12.     -> ('D',0xB4EE,0xB6E9),  
  13.     -> ('E',0xB6EA,0xB7A1),  
  14.     -> ('F',0xB7A2,0xB8C0),  
  15.     -> ('G',0xB8C1,0xB9FD),  
  16.     -> ('H',0xB9FE,0xBBF6),  
  17.     -> ('J',0xBBF7,0xBFA5),  
  18.     -> ('K',0xBFA6,0xC0AB),  
  19.     -> ('L',0xC0AC,0xC2E7),  
  20.     -> ('M',0xC2E8,0xC4C2),  
  21.     -> ('N',0xC4C3,0xC5B5),  
  22.     -> ('O',0xC5B6,0xC5BD),  
  23.     -> ('P',0xC5BE,0xC6D9),  
  24.     -> ('Q',0xC6DA,0xC8BA),  
  25.     -> ('R',0xC8BB,0xC8F5),  
  26.     -> ('S',0xC8F6,0xCBF9),  
  27.     -> ('T',0xCBFA,0xCDD9),  
  28.     -> ('W',0xCDDA,0xCEF3),  
  29.     -> ('X',0xCEF4,0xD188),  
  30.     -> ('Y',0xD1B9,0xD4D0),  
  31.     -> ('Z',0xD4D1,0xD7F9);  
  32. Query OK, 23 rows affected (0.16 sec)  
  33. Records: 23  Duplicates: 0  Warnings: 0  
  34.  
  35. mysql> select * from  o_personnel;  
  36. +------+------------+  
  37. | A_Id | A_UserName |  
  38. +------+------------+  
  39. |    1 | 首先       |  
  40. |    2 | 检查       |  
  41. |    3 | 我们       |  
  42. |    4 | 的二       |  
  43. |    5 | 进制       |  
  44. |    6 | 是否       |  
  45. |    7 | 适合       |  
  46. |    8 | 你的       |  
  47. |    9 | 平台       |  
  48. +------+------------+  
  49. rows in set (0.00 sec)  
  50.  
  51. mysql> select p.*,c.*  
  52.     -> from o_personnel p , t_cosler c  
  53.     -> where  CONV(HEX(left(A_UserName,1)),16,10) between c.cBegin and c.cEnd;  
  54. +------+------------+------+--------+-------+  
  55. | A_Id | A_UserName | f_PY | cBegin | cEnd  |  
  56. +------+------------+------+--------+-------+  
  57. |    4 | 的二       | D    |  46318 | 46825 |  
  58. |    2 | 检查       | J    |  48119 | 49061 |  
  59. |    5 | 进制       | J    |  48119 | 49061 |  
  60. |    8 | 你的       | N    |  50371 | 50613 |  
  61. |    9 | 平台       | P    |  50622 | 50905 |  
  62. |    1 | 首先       | S    |  51446 | 52217 |  
  63. |    6 | 是否       | S    |  51446 | 52217 |  
  64. |    7 | 适合       | S    |  51446 | 52217 |  
  65. |    3 | 我们       | W    |  52698 | 52979 |  
  66. +------+------------+------+--------+-------+  
  67. rows in set (0.00 sec)  
  68.  
  69. mysql> 

举例:查S开头的

   sql代码
  1. mysql> select p.*  
  2.     -> from o_personnel p , t_cosler c  
  3.     -> where  CONV(HEX(left(A_UserName,1)),16,10) between c.cBegin and c.cEnd  
  4.     -> and c.f_PY='S';  
  5. +------+------------+  
  6. | A_Id | A_UserName |  
  7. +------+------------+  
  8. |    1 | 首先       |  
  9. |    6 | 是否       |  
  10. |    7 | 适合       |  
  11. +------+------------+  
  12. rows in set (0.00 sec)  
  13.  
  14. mysql> 

方法二:不用这个t_cosler表,直接写个函数权限汉字得到拼音。

局限性: 以上方法,均依照汉字区位表来实现,对区位后面的复杂字,无法准确判断,对多音字无法准确判断。

方法三:从微软拼音中导出所有汉字的拼音表。

返回页面顶部  

jastby
2F Re:[转]mysql 根据英文首字母(拼音)来查询汉字函数   Post by : 2009-06-12 12:23:32.0
  • 幼儿园
  • 幼儿园
  • UID:2
  • 主题:126
  • 帖子:219
  • 加为好友 加为好友    发送短信 发送短信

如果不建表,但也未必不复杂。

   sql代码
  1. mysql> SELECT *,  
  2.     ->  ELT(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10),  
  3.     ->          0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0  
  4. xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCE  
  5. F4,0xD1B9,0xD4D1),  
  6.     ->          'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q',  
  7. 'R','S','T','W','X','Y','Z'as PY  
  8.     -> from o_personnel;  
  9. +------+------------+------+  
  10. | A_Id | A_UserName | PY   |  
  11. +------+------------+------+  
  12. |    1 | 首先       | S    |  
  13. |    2 | 检查       | J    |  
  14. |    3 | 我们       | W    |  
  15. |    4 | 的二       | D    |  
  16. |    5 | 进制       | J    |  
  17. |    6 | 是否       | S    |  
  18. |    7 | 适合       | S    |  
  19. |    8 | 你的       | N    |  
  20. |    9 | 平台       | P    |  
  21. +------+------------+------+  
  22. rows in set (0.00 sec)  
  23.  
  24. mysql> 

简化一下:

   sql代码
  1. mysql> SELECT *,  
  2.     ->  CHAR(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10),  
  3.     ->          0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,  
  4.     ->          0xBBF7,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,  
  5.     ->          0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCDDA,0xCDDA,0xCEF4,  
  6.     ->          0xD1B9,0xD4D1)+64) as PY  
  7.     -> from o_personnel;  
  8. +------+------------+------+  
  9. | A_Id | A_UserName | PY   |  
  10. +------+------------+------+  
  11. |    1 | 首先       | S    |  
  12. |    2 | 检查       | J    |  
  13. |    3 | 我们       | W    |  
  14. |    4 | 的二       | D    |  
  15. |    5 | 进制       | J    |  
  16. |    6 | 是否       | S    |  
  17. |    7 | 适合       | S    |  
  18. |    8 | 你的       | N    |  
  19. |    9 | 平台       | P    |  
  20. +------+------------+------+  
  21. rows in set (0.00 sec)  
  22.  
  23. mysql> 
返回页面顶部  


CopyRight © 2008-2009 JavaWind.Net Studio All Rights Reserved
Powered By JWind.BBS Vesion 1.0.0 Beta1 Processed in 17 ms,0 (Queries)  Gzip enabled

WAP - 清除Cookies - 联系我们 - JavaWind.Net Studio - Archiver - TOP Valid XHTML 1.0 Transitional Valid CSS! 粤ICP备07511478号