用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > mysql教程

mysql自定义函数实现中文首字母拼音查询

时间:2015-01-23  来源:西部数据  作者:西部数据

在mysql中没有系统自带的函数可以实现查找中文字符的第一个汉字的首字母了,在这里我整理了两种比较好用的方法,下面一起来看看吧.

例子1:mysql功能函数,实现拼音查询.

功能:输入中文字符串每个字的首字母,即可检索出相应数据.

使用方法:直接使用py(字段名)=‘keywords’,即可,代码如下:

  1. DELIMITER $$ 
  2. CREATE FUNCTION `PYFIRST`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8   
  3. BEGIN   
  4.     DECLARE V_RETURN VARCHAR(255);   
  5.     SET V_RETURN = ELT(INTERVAL(CONV(HEX(left(CONVERT(P_NAME USING gbk),1)),16,10),    
  6.         0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,    
  7.         0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,   
  8.         0xC8F6,0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1), 'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z');   
  9.     RETURN V_RETURN;   
  10. END$$ 
  11. DELIMITER ; 
  12.  
  13. DELIMITER $$ 
  14. CREATE FUNCTION `PY`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8  
  15. BEGIN   
  16.     DECLARE V_COMPARE VARCHAR(255);   
  17.     DECLARE V_RETURN VARCHAR(255);   
  18.     DECLARE I INT;   
  19.  
  20.     SET I = 1;   
  21.     SET V_RETURN = '';   
  22.     while I < LENGTH(P_NAME) do   
  23.         SET V_COMPARE = SUBSTR(P_NAME, I, 1);   
  24.         IF (V_COMPARE != ''THEN   
  25.             #SET V_RETURN = CONCAT(V_RETURN, ',', V_COMPARE);   
  26.             SET V_RETURN = CONCAT(V_RETURN, PYFIRST(V_COMPARE));   
  27.             #SET V_RETURN = PYFIRST(V_COMPARE);   
  28.         END IF;   
  29.         SET I = I + 1;   
  30.     end while;   
  31.  
  32.     IF (ISNULL(V_RETURN) or V_RETURN = ''THEN   
  33.         SET V_RETURN = P_NAME;   
  34.     END IF;   
  35.  
  36.     RETURN V_RETURN;   
  37. END$$ 
  38. DELIMITER ; 

例子2,现在给出在mysql 里实现的,测试环境是mysql-5.0.27-win32.

1、建立拼音首字母资料表,代码如下:

  1. DROP   TABLE   IF   EXISTS   `pyk`;    
  2.   CREATE   TABLE   `pyk`   (    
  3.       `PY`   varchar(1)    ,    
  4.       `HZ1`   int  , 
  5.       `HZ2`   int       
  6.   ) ; 
  7.      
  8. INSERT   INTO   `pyk`   (`PY`,`HZ1`,`HZ2`)   VALUES      
  9. ('A',-20319,-20284), 
  10. ('B',-20283,-19776), 
  11. ('C',-19775,-19219),  
  12. ('D',-19218,-18711),  
  13. ('E',-18710,-18527),  
  14. ('F',-18526,-18240),  
  15. ('G',-18239,-17923),  
  16. ('H',-17922,-17418),               
  17. ('J',-17417,-16475),               
  18. ('K',-16474,-16213),               
  19. ('L',-16212,-15641),               
  20. ('M',-15640,-15166),               
  21. ('N',-15165,-14923),               
  22. ('O',-14922,-14915),               
  23. ('P',-14914,-14631),               
  24. ('Q',-14630,-14150),               
  25. ('R',-14149,-14091),               
  26. ('S',-14090,-13319),               
  27. ('T',-13318,-12839),               
  28. ('W',-12838,-12557),               
  29. ('X',-12556,-11848),               
  30. ('Y',-11847,-11056),               
  31. ('Z',-11055,-10247); 

2、建立mysql 函数,代码如下:

  1. DROP FUNCTION IF EXISTS hzcode; 
  2.  
  3. delimiter // 
  4.  
  5. CREATE FUNCTION hzcode (s CHAR(255)) RETURNS char 
  6. BEGIN 
  7. DECLARE hz_code int
  8. DECLARE hz_py char
  9. SET hz_code = ord(substring(s,1,1))*256+ord(substring(s,2,1))-65536 ; 
  10. select py into hz_py from pyk where  hz_code>=pyk.hz1 and hz_code<=pyk 
  11. .hz2;                   
  12. RETURN hz_py; 
  13. END 
  14. // 

delimiter ;

数据库类型如果是GBK的时候,这个函数好像有点小问题,稍微改动了下,貌似可以在GBK中使用了,代码如下:

  1. delimiter $$ 
  2.  
  3. DROP FUNCTION IF EXISTS `hzcode`$$ 
  4. CREATE FUNCTION `hzcode` (s CHAR(255)) RETURNS char 
  5.         BEGIN 
  6.                 DECLARE hz_code int
  7.                 DECLARE hz_py char
  8.                 declare str varchar(400); 
  9.                 SET hz_code = ord(substring(s,1,1))-65536 ; 
  10.                 select py into hz_py from pyk where  hz_code>=pyk.hz1 and hz_code<=pyk.hz2;                
  11.                 RETURN hz_py; 
  12.  
  13.         END$$        
  14. delimiter $$ 

3、先测试一下

  1. mysql> select hzcode('南海龙王'); 
  2. +--------------------+ 
  3. | hzcode('南海龙王') | 
  4. +--------------------+ 
  5. | N | 
  6. +--------------------+ 
  7. 1 row in set (0.00 sec) 

4、建立个测试表

  1. DROP   TABLE   IF   EXISTS  `f1`; 
  2. create table f1 ( 
  3.  name varchar(30), 
  4.  pykey varchar(1) 
  5.  ); 
  6.  
  7. insert into f1(namevalues 
  8. ('张三'), 
  9. ('李四'), 
  10. ('王五'), 
  11. ('赵六'), 
  12. ('钱七'); 

5、测试

  1. mysql> select * from f1; 
  2. +------+-------+ 
  3. name | pykey | 
  4. +------+-------+ 
  5. | 张三 | NULL | 
  6. | 李四 | NULL | 
  7. | 王五 | NULL | 
  8. | 赵六 | NULL | 
  9. | 钱七 | NULL | 
  10. +------+-------+ 
  11. rows in set (0.00 sec) 
  12. mysql> update f1 set pykey = hzcode(name); 
  13. Query OK, 5 rows affected (0.05 sec) 
  14. Rows matched: 5 Changed: 5 Warnings: 0 
  15. mysql> select * from f1;//开源代码phpfensi.com 
  16. +------+-------+ 
  17. name | pykey | 
  18. +------+-------+ 
  19. | 张三 | Z | 
  20. | 李四 | L | 
  21. | 王五 | W | 
  22. | 赵六 | Z | 
  23. | 钱七 | Q | 
  24. +------+-------+ 
  25. rows in set (0.00 sec) 

这样就很方便地在MYSQL里查询汉字的首字母了,类似地也可以直接在MYSQL得到汉字拼音,不过需要拼音表,函数写法也不一样.

来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
栏目更新
栏目热门