首页  >  问答  >  正文

php - 根据字母查询数据的需求 我想在表里新建一个字段保存每个汉字的首字母 mysql 中有什么语句 如何取得各汉字首字母

1.有哪个php大神做过这类功能 麻烦指导下我
2.有mysql经验的 麻烦指导下我

高洛峰高洛峰2729 天前694

全部回复(2)我来回复

  • phpcn_u1582

    phpcn_u15822017-05-24 11:33:19

    没必要用mysql跑取首字母功能吧...

    PHP可以处理的。

    <?php
    function getfirstchar($s0){

    $fchar = ord($s0{0}); 
    if($fchar >= ord("A") and $fchar <= ord("z") )return strtoupper($s0{0}); 
    $s1 = iconv("UTF-8","gb2312", $s0); 
    $s2 = iconv("gb2312","UTF-8", $s1); 
    if($s2 == $s0){$s = $s1;}else{$s = $s0;} 
    $asc = ord($s{0}) * 256 + ord($s{1}) - 65536; 
    if($asc >= -20319 and $asc <= -20284) return "A"; 
    if($asc >= -20283 and $asc <= -19776) return "B"; 
    if($asc >= -19775 and $asc <= -19219) return "C"; 
    if($asc >= -19218 and $asc <= -18711) return "D"; 
    if($asc >= -18710 and $asc <= -18527) return "E"; 
    if($asc >= -18526 and $asc <= -18240) return "F"; 
    if($asc >= -18239 and $asc <= -17923) return "G"; 
    if($asc >= -17922 and $asc <= -17418) return "H"; 
    if($asc >= -17417 and $asc <= -16475) return "J"; 
    if($asc >= -16474 and $asc <= -16213) return "K"; 
    if($asc >= -16212 and $asc <= -15641) return "L"; 
    if($asc >= -15640 and $asc <= -15166) return "M"; 
    if($asc >= -15165 and $asc <= -14923) return "N"; 
    if($asc >= -14922 and $asc <= -14915) return "O"; 
    if($asc >= -14914 and $asc <= -14631) return "P"; 
    if($asc >= -14630 and $asc <= -14150) return "Q"; 
    if($asc >= -14149 and $asc <= -14091) return "R"; 
    if($asc >= -14090 and $asc <= -13319) return "S"; 
    if($asc >= -13318 and $asc <= -12839) return "T"; 
    if($asc >= -12838 and $asc <= -12557) return "W"; 
    if($asc >= -12556 and $asc <= -11848) return "X"; 
    if($asc >= -11847 and $asc <= -11056) return "Y"; 
    if($asc >= -11055 and $asc <= -10247) return "Z"; 
    return null; 

    }

    function pinyin1($zh){

    $ret = ""; 
    $s1 = iconv("UTF-8","gb2312", $zh); 
    $s2 = iconv("gb2312","UTF-8", $s1); 
    if($s2 == $zh){$zh = $s1;} 
    for($i = 0; $i < strlen($zh); $i++){ 
        $s1 = substr($zh,$i,1); 
        $p = ord($s1); 
        if($p > 160){ 
            $s2 = substr($zh,$i++,2); 
            $ret .= getfirstchar($s2); 
        }else{ 
            $ret .= $s1; 
        } 
    } 
    return $ret; 

    }
    echo pinyin1('这是中文字符串');

    回复
    0
  • 阿神

    阿神2017-05-24 11:33:19

    这样维护字母的表多大啊。。。

    -- 建立汉字转换拼音函数
    DROP FUNCTION IF EXISTS to_pinyin;
    DELIMITER $
    CREATE FUNCTION to_pinyin(NAME VARCHAR(255) CHARSET gbk)
    RETURNS VARCHAR(255) CHARSET gbk
    BEGIN
        DECLARE mycode INT;
        DECLARE tmp_lcode VARCHAR(2) CHARSET gbk;
        DECLARE lcode INT;
        DECLARE tmp_rcode VARCHAR(2) CHARSET gbk;
        DECLARE rcode INT;
        DECLARE mypy VARCHAR(255) CHARSET gbk DEFAULT '';
        DECLARE lp INT;
        SET mycode = 0;
        SET lp = 1;
        SET NAME = HEX(NAME);
        WHILE lp < LENGTH(NAME) DO
            SET tmp_lcode = SUBSTRING(NAME, lp, 2);
            SET lcode = CAST(ASCII(UNHEX(tmp_lcode)) AS UNSIGNED); 
            SET tmp_rcode = SUBSTRING(NAME, lp + 2, 2);
            SET rcode = CAST(ASCII(UNHEX(tmp_rcode)) AS UNSIGNED); 
            IF lcode > 128 THEN
                SET mycode =65536 - lcode * 256 - rcode ;
                SELECT CONCAT(mypy,pin_yin_) INTO mypy FROM t_base_pinyin WHERE CODE_ >= ABS(mycode) ORDER BY CODE_ ASC LIMIT 1;
                SET lp = lp + 4;
            ELSE
                SET mypy = CONCAT(mypy,CHAR(CAST(ASCII(UNHEX(SUBSTRING(NAME, lp, 2))) AS UNSIGNED)));
                SET lp = lp + 2;
            END IF;
        END WHILE;
        RETURN LOWER(mypy);
    END;
    $
    DELIMITER ;

    回复
    0
  • 取消回复