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

解决方案 »

  1.   

    具体一点要求是什么?比如输入A,把表 tbl 中 字段 f 中以 ‘啊,挨,等开始的都选取出来?
      

  2.   

    是什么字符集,show create table yourTable 看一下。
      

  3.   

    | o_personnel | CREATE TABLE `o_personnel` (
      `A_Id` int(10) NOT NULL auto_increment,
      `A_UserName` varchar(50) default NULL,
      `A_PassWord` varchar(50) default NULL,
      `A_Name` varchar(50) default NULL,
      `A_Sex` varchar(50) default NULL,
      `A_IdCard` varchar(50) default NULL,
      `A_LeaveCase` mediumtext,
      PRIMARY KEY  (`A_Id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312 |
     
    A_UserName
      

  4.   

    方法一:建一个拼音表 t_cosler ,存放每个字母开头的第一个汉字的编号和最后一个汉字的编号。
    [code=BatchFile]+------+--------+-------+
    | f_PY | cBegin | cEnd  |
    +------+--------+-------+
    | A    |  45217 | 45252 |
    | B    |  45253 | 45760 |
    .....
    | Z    |  54481 | 55289 |
    +------+--------+-------+[/code]然后直接查询就行了。mysql> create table t_cosler(
        ->  f_PY char primary key,
        ->  cBegin  SMALLINT UNSIGNED not null,
        ->  cEnd    SMALLINT UNSIGNED not null
        -> );
    Query OK, 0 rows affected (0.09 sec)mysql> insert into t_cosler values
        -> ('A',0xB0A1,0xB0C4),
        -> ('B',0xB0C5,0xB2C0),
        -> ('C',0xB2C1,0xB4ED),
        -> ('D',0xB4EE,0xB6E9),
        -> ('E',0xB6EA,0xB7A1),
        -> ('F',0xB7A2,0xB8C0),
        -> ('G',0xB8C1,0xB9FD),
        -> ('H',0xB9FE,0xBBF6),
        -> ('J',0xBBF7,0xBFA5),
        -> ('K',0xBFA6,0xC0AB),
        -> ('L',0xC0AC,0xC2E7),
        -> ('M',0xC2E8,0xC4C2),
        -> ('N',0xC4C3,0xC5B5),
        -> ('O',0xC5B6,0xC5BD),
        -> ('P',0xC5BE,0xC6D9),
        -> ('Q',0xC6DA,0xC8BA),
        -> ('R',0xC8BB,0xC8F5),
        -> ('S',0xC8F6,0xCBF9),
        -> ('T',0xCBFA,0xCDD9),
        -> ('W',0xCDDA,0xCEF3),
        -> ('X',0xCEF4,0xD188),
        -> ('Y',0xD1B9,0xD4D0),
        -> ('Z',0xD4D1,0xD7F9);
    Query OK, 23 rows affected (0.16 sec)
    Records: 23  Duplicates: 0  Warnings: 0mysql> select * from  o_personnel;
    +------+------------+
    | A_Id | A_UserName |
    +------+------------+
    |    1 | 首先       |
    |    2 | 检查       |
    |    3 | 我们       |
    |    4 | 的二       |
    |    5 | 进制       |
    |    6 | 是否       |
    |    7 | 适合       |
    |    8 | 你的       |
    |    9 | 平台       |
    +------+------------+
    9 rows in set (0.00 sec)mysql> select p.*,c.*
        -> from o_personnel p , t_cosler c
        -> where  CONV(HEX(left(A_UserName,1)),16,10) between c.cBegin and c.cEnd;
    +------+------------+------+--------+-------+
    | A_Id | A_UserName | f_PY | cBegin | cEnd  |
    +------+------------+------+--------+-------+
    |    4 | 的二       | D    |  46318 | 46825 |
    |    2 | 检查       | J    |  48119 | 49061 |
    |    5 | 进制       | J    |  48119 | 49061 |
    |    8 | 你的       | N    |  50371 | 50613 |
    |    9 | 平台       | P    |  50622 | 50905 |
    |    1 | 首先       | S    |  51446 | 52217 |
    |    6 | 是否       | S    |  51446 | 52217 |
    |    7 | 适合       | S    |  51446 | 52217 |
    |    3 | 我们       | W    |  52698 | 52979 |
    +------+------------+------+--------+-------+
    9 rows in set (0.00 sec)mysql>查S开头的
    mysql> select p.*
        -> from o_personnel p , t_cosler c
        -> where  CONV(HEX(left(A_UserName,1)),16,10) between c.cBegin and c.cEnd
        -> and c.f_PY='S';
    +------+------------+
    | A_Id | A_UserName |
    +------+------------+
    |    1 | 首先       |
    |    6 | 是否       |
    |    7 | 适合       |
    +------+------------+
    3 rows in set (0.00 sec)mysql>方法二:不用这个t_cosler表,直接写个函数权限汉字得到拼音。局限性: 以上方法,均依照汉字区位表来实现,对区位后面的复杂字,无法准确判断,对多音字无法准确判断。方法三:从微软拼音中导出所有汉字的拼音表。
      

  5.   

    不建表,但也未必不复杂。
    mysql> SELECT *,
        ->  ELT(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10),
        ->          0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0
    xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCE
    F4,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') as PY
        -> from o_personnel;
    +------+------------+------+
    | A_Id | A_UserName | PY   |
    +------+------------+------+
    |    1 | 首先       | S    |
    |    2 | 检查       | J    |
    |    3 | 我们       | W    |
    |    4 | 的二       | D    |
    |    5 | 进制       | J    |
    |    6 | 是否       | S    |
    |    7 | 适合       | S    |
    |    8 | 你的       | N    |
    |    9 | 平台       | P    |
    +------+------------+------+
    9 rows in set (0.00 sec)mysql>
      

  6.   

     谢谢 ACMAIN_CHM 给我解决了问题。
     呵呵
     结了
      

  7.   

    借鉴了一下你提供的思路,简化了一下。mysql> SELECT *,
        ->  CHAR(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10),
        ->          0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,
        ->          0xBBF7,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,
        ->          0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCDDA,0xCDDA,0xCEF4,
        ->          0xD1B9,0xD4D1)+64) as PY
        -> from o_personnel;
    +------+------------+------+
    | A_Id | A_UserName | PY   |
    +------+------------+------+
    |    1 | 首先       | S    |
    |    2 | 检查       | J    |
    |    3 | 我们       | W    |
    |    4 | 的二       | D    |
    |    5 | 进制       | J    |
    |    6 | 是否       | S    |
    |    7 | 适合       | S    |
    |    8 | 你的       | N    |
    |    9 | 平台       | P    |
    +------+------------+------+
    9 rows in set (0.00 sec)mysql>
      

  8.   

    DELIMITER $$;DROP FUNCTION IF EXISTS `test`.`ChineseCode`$$CREATE DEFINER=`root`@`localhost` FUNCTION `ChineseCode`(s varchar(50)) RETURNS char(1) CHARSET latin1
    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 base_code where hz_code>=base_code.hz1 and hz_code<=base_code.hz2;    
    return hz_py;
    END$$DELIMITER ;$$
      

  9.   

    http://zhao4zhong1.download.csdn.net/可以下载拼音汉字对照表
      

  10.   


    如果数据库编码是utf8,又怎么实现呢
      

  11.   

    太深了,我也正在考虑如何用vfp来实现
      

  12.   

    今天正好要实现这个功能,但是我的数据库是utf8的查不到数据,
    utf8该怎么解决