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

例子1

mysql功能函数 实现拼音查询:
功能:输入中文字符串每个字的首字母,即可检索出相应数据。
使用方法:直接使用py(字段名)=‘keywords’,即可.

 代码如下 复制代码

DELIMITER $$
CREATE FUNCTION `PYFIRST`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8 
BEGIN 
    DECLARE V_RETURN VARCHAR(255); 
    SET V_RETURN = ELT(INTERVAL(CONV(HEX(left(CONVERT(P_NAME USING gbk),1)),16,10),  
        0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,  
        0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB, 
        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'); 
    RETURN V_RETURN; 
END$$
DELIMITER ;
 
DELIMITER $$
CREATE FUNCTION `PY`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8 
BEGIN 
    DECLARE V_COMPARE VARCHAR(255); 
    DECLARE V_RETURN VARCHAR(255); 
    DECLARE I INT; 
 
    SET I = 1; 
    SET V_RETURN = ''; 
    while I < LENGTH(P_NAME) do 
        SET V_COMPARE = SUBSTR(P_NAME, I, 1); 
        IF (V_COMPARE != '') THEN 
            #SET V_RETURN = CONCAT(V_RETURN, ',', V_COMPARE); 
            SET V_RETURN = CONCAT(V_RETURN, PYFIRST(V_COMPARE)); 
            #SET V_RETURN = PYFIRST(V_COMPARE); 
        END IF; 
        SET I = I + 1; 
    end while; 
 
    IF (ISNULL(V_RETURN) or V_RETURN = '') THEN 
        SET V_RETURN = P_NAME; 
    END IF; 
 
    RETURN V_RETURN; 
END$$
DELIMITER ;

例子2

现在给出在mysql 里实现的, 测试环境是mysql-5.0.27-win32
1、建立拼音首字母资料表

 代码如下 复制代码
DROP   TABLE   IF   EXISTS   `pyk`;  
  CREATE   TABLE   `pyk`   (  
      `PY`   varchar(1)    ,  
      `HZ1`   int  ,
      `HZ2`   int     
  ) ;
   
INSERT   INTO   `pyk`   (`PY`,`HZ1`,`HZ2`)   VALUES    
('A',-20319,-20284),
('B',-20283,-19776),
('C',-19775,-19219),
('D',-19218,-18711),
('E',-18710,-18527),
('F',-18526,-18240),
('G',-18239,-17923),
('H',-17922,-17418),             
('J',-17417,-16475),             
('K',-16474,-16213),             
('L',-16212,-15641),             
('M',-15640,-15166),             
('N',-15165,-14923),             
('O',-14922,-14915),             
('P',-14914,-14631),             
('Q',-14630,-14150),             
('R',-14149,-14091),             
('S',-14090,-13319),             
('T',-13318,-12839),             
('W',-12838,-12557),             
('X',-12556,-11848),             
('Y',-11847,-11056),             
('Z',-11055,-10247);
2、建立mysql 函数
DROP FUNCTION IF EXISTS hzcode;
 
delimiter //
 
CREATE FUNCTION hzcode (s CHAR(255)) RETURNS char
BEGIN
DECLARE hz_code int;
DECLARE hz_py char;
SET hz_code = ord(substring(s,1,1))*256+ord(substring(s,2,1))-65536 ;
select py into hz_py from pyk where  hz_code>=pyk.hz1 and hz_code<=pyk
.hz2;                 
RETURN hz_py;
END
//
 
delimiter ;
数据库类型如果是GBK的时候,这个函数好像有点小问题,稍微改动了下,貌似可以在GBK中使用了
delimiter $$
DROP FUNCTION IF EXISTS `hzcode`$$
CREATE FUNCTION `hzcode` (s CHAR(255)) RETURNS char
        BEGIN
                DECLARE hz_code int;
                DECLARE hz_py char;
                declare str varchar(400);
                SET hz_code = ord(substring(s,1,1))-65536 ;
                select py into hz_py from pyk where  hz_code>=pyk.hz1 and hz_code<=pyk.hz2;              
                RETURN hz_py;
 
        END$$      
delimiter $$
3、先测试一下
mysql> select hzcode('南海龙王');
+--------------------+
| hzcode('南海龙王') |
+--------------------+
| N |
+--------------------+
1 row in set (0.00 sec)
4、建立个测试表
DROP   TABLE   IF   EXISTS  `f1`;
create table f1 (
 name varchar(30),
 pykey varchar(1)
 );
 
insert into f1(name) values
('张三'),
('李四'),
('王五'),
('赵六'),
('钱七');
5、测试
mysql> select * from f1;
+------+-------+
| name | pykey |
+------+-------+
| 张三 | NULL |
| 李四 | NULL |
| 王五 | NULL |
| 赵六 | NULL |
| 钱七 | NULL |
+------+-------+
5 rows in set (0.00 sec)
mysql> update f1 set pykey = hzcode(name);
Query OK, 5 rows affected (0.05 sec)
Rows matched: 5 Changed: 5 Warnings: 0
mysql> select * from f1;
+------+-------+
| name | pykey |
+------+-------+
| 张三 | Z |
| 李四 | L |
| 王五 | W |
| 赵六 | Z |
| 钱七 | Q |
+------+-------+
5 rows in set (0.00 sec)

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

时间: 2024-10-27 05:59:41

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

PHP自定义函数获取汉字首字母的方法_php技巧

本文实例讲述了PHP自定义函数获取汉字首字母的方法.分享给大家供大家参考,具体如下: 首字母很重要,可以进行排序使用. 城市列表等等. <?php /* * Created on 2016-12-1 */ function getFirstCharter($str) { if (empty($str)) { return ''; } $fchar = ord($str{0}); if ($fchar >= ord('A') && $fchar <= ord('z')) r

PHP程序,中文首字母排序

问题描述 PHP程序,中文首字母排序 中文首字母排序 $arr = array( array( 'name' => '学习' 'size' => '1235' 'type' => 'jpe' 'time' => '1921-11-13' ) array( 'name' => '世界' 'size' => '153' 'type' => 'jpe' 'time' => '2005-11-13' ) array( 'name' => '编程' 'size'

Java实现按中文首字母排序的具体实例_java

要实现"按中文首字母排序"操作,可以使用java.util包下的Arrays类的sort()函数. Arrays类包含用来操作数组(比如排序和搜索)的各种方法. 比如对于排序操作的sort()函数,重载了多种静态函数以适应不同情况下的需要. 以下,我们应用最后一个重载函数来实现"按中文首字母排序": 复制代码 代码如下: sort(T[] a, Comparator<? super T> c)   根据指定比较器产生的顺序对指定对象数组进行排序.  代码

基于jquery的使ListNav兼容中文首字拼音排序的实现代码_jquery

效果图如下所示: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>中

浅谈mysql 自定义函数_Mysql

因为工作需要,要写一个mysql的自定义行数,如下 DELIMITER $$ DROP FUNCTION IF EXISTS `onlineFunction`$$ CREATE FUNCTION `onlineFunction`(rrrr VARCHAR(50)) RETURNS VARCHAR(255) BEGIN IF(rrrr='online') THEN RETURN '上线';END IF; END$$ DELIMITER ; 第一行DELIMITER 定义一个结束标识符,因为MySQ

MySQL 自定义函数CREATE FUNCTION示例_Mysql

mysql> mysql> delimiter $$ mysql> mysql> CREATE FUNCTION myFunction -> (in_string VARCHAR(255), -> in_find_str VARCHAR(20), -> in_repl_str VARCHAR(20)) -> -> RETURNS VARCHAR(255) -> BEGIN -> DECLARE l_new_string VARCHAR(25

中文首字母 排序

因项目需要对通讯录中的联系人进行排序,需要对中文字符进行拼音转换.其实这个转换并没有想象中的那么难(因为我们只是把中文转为拼音首字母而已,比如"王"转换为字母w就可以了,而不需要转换为完整的拼音wang).对此,我们找到了一个简便的解决办法:一个老外(代码中签名的作者叫George)用c语言写了一个pinyinFirstLetter函数用于获取中文拼音首字母. 这个函数主要基于一个巨大的c语言char数组,把unicode字符集中所有中文的拼音首字母都映射进去了. pinyinFirs

php中获取中文首字母程序代码

 代码如下 复制代码 例 <?php $limit = array( //gb2312 拼音排序     array(45217,45252), //A     array(45253,45760), //B     array(45761,46317), //C     array(46318,46825), //D     array(46826,47009), //E     array(47010,47296), //F     array(47297,47613), //G     a

PHP提取中文首字母_php技巧

复制代码 代码如下: <?     function pykey( $py_key)     {         $pinyin = 65536 + pys($py_key);         if ( 45217 <= $pinyin && $pinyin <= 45252 )         {             $zimu = "A";             return $zimu;         }         if ( 452