如题!SET GLOBAL log_bin_trust_function_creators = 1;
DELIMITER $$ DROP FUNCTION IF EXISTS `hzcode`$$ CREATE FUNCTION `hzcode`(s CHAR(255)) RETURNS CHAR(255) CHARSET utf8 
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  ;
---------------------------
网上找到这个自定义函数
但是好像不好使 执行的结果时NULL 

解决方案 »

  1.   

    建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。或者为什么不直接用 INSTR() ?
      

  2.   

    以下是再网上找的一些资料---------------------
    在mysql 里实现查询汉字的拼音首字母
    php 里查询汉字的拼音首字母已经有很多参考的代码了。
    现在给出在mysql 里实现的, 测试环境是mysql-5.0.27-win321、建立拼音首字母资料表
    [code]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),
    ('I',-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),              
    ('V',-13318,-12839),              
    ('W',-12838,-12557),              
    ('X',-12556,-11848),              
    ('Y',-11847,-11056),              
    ('Z',-11055,-10247);    [/code]
    d
    select ord(substring('宋',0,1)); 3853355776
    2、建立mysql 函数SET GLOBAL log_bin_trust_function_creators = 1;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 ;[/code]3、先测试一下
    [font=Courier New]mysql> select hzcode('南海龙王');
    +--------------------+
    | hzcode('南海龙王') |
    +--------------------+
    | N                  |
    +--------------------+
    1 row in set (0.00 sec)[/font]4、建立个测试表[code]DROP   TABLE   IF   EXISTS  `f1`;
    create table f1 (
    name varchar(30) charset gbk,
    pykey varchar(1) charset gbk
    );insert into f1(name) values
    ('张三'),
    ('李四'),
    ('王五'),
    ('赵六'),
    ('钱七');[/code]5、测试[font=Courier New]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: 0mysql> select * from f1;
    +------+-------+
    | name | pykey |
    +------+-------+
    | 张三 | Z     |
    | 李四 | L     |
    | 王五 | W     |
    | 赵六 | Z     |
    | 钱七 | Q     |
    +------+-------+
    5 rows in set (0.00 sec)
    -------------------------------
    就是实现这个功能
      

  3.   


    补充一个首拼音字母表
    --------------------------------------
    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),
    ('I',-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),              
    ('V',-13318,-12839),              
    ('W',-12838,-12557),              
    ('X',-12556,-11848),              
    ('Y',-11847,-11056),              
    ('Z',-11055,-10247); 
      

  4.   

    有两个问题 
    1.你的拼音表是怎么计算出来的范围2.你的计算hz_py的算法为什么减去65536
      

  5.   

    这个我不清楚
    因为是从网上查的 而且我用的时候字段为UTF-8编码的
    不好使 
    来问问有人能具体的说下怎么通过拼音首字母检索这个字段
      

  6.   

    http://topic.csdn.net/u/20090611/17/7579bb9a-0a7c-4460-a302-10bae7f4a9c5.html?92656
    mysql 根据英文首字母来查询汉字函数
    有时候看一下论坛中的精华贴就有类似的问题已经提过了。