sql 获取汉字首字母的函数.SQL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 获取汉字首字母的函数.SQL相关的知识,希望对你有一定的参考价值。

-- 创建获取汉字首字母的函数
CREATE FUNCTION FirstPinyin(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
-- 编写查询语句
SELECT * FROM article ORDER BY IFNULL(FirstPinyin(title),substring(title, 1, 1)) ASC`

-- mysql 中如何取得汉字字段的各汉字首字母
DROP FUNCTION IF EXISTS `getPY`; 
DELIMITER ;; 
CREATE FUNCTION `getPY`(in_string VARCHAR(65534)) RETURNS mediumtext CHARSET utf8 
BEGIN 
DECLARE tmp_str VARCHAR(65534) charset gbk DEFAULT '' ; #截取字符串,每次做截取后的字符串存放在该变量中,初始为函数参数in_string值 
DECLARE tmp_len SMALLINT DEFAULT 0;#tmp_str的长度 
DECLARE tmp_char VARCHAR(2) charset gbk DEFAULT '';#截取字符,每次 left(tmp_str,1) 返回值存放在该变量中 
DECLARE tmp_rs VARCHAR(65534) charset gbk DEFAULT '';#结果字符串 
DECLARE tmp_cc VARCHAR(2) charset gbk DEFAULT '';#拼音字符,存放单个汉字对应的拼音首字符 
SET tmp_str = in_string;#初始化,将in_string赋给tmp_str 
SET tmp_len = LENGTH(tmp_str);#初始化长度 
WHILE tmp_len > 0 DO #如果被计算的tmp_str长度大于0则进入该while 
SET tmp_char = LEFT(tmp_str,1);#获取tmp_str最左端的首个字符,注意这里是获取首个字符,该字符可能是汉字,也可能不是。 
SET tmp_cc = tmp_char;#左端首个字符赋值给拼音字符 
IF LENGTH(tmp_char)>1 THEN#判断左端首个字符是多字节还是单字节字符,要是多字节则认为是汉字且作以下拼音获取,要是单字节则不处理。 
SELECT ELT(INTERVAL(CONV(HEX(tmp_char),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') INTO tmp_cc; #获得汉字拼音首字符 
END IF; 
SET tmp_rs = CONCAT(tmp_rs,tmp_cc);#将当前tmp_str左端首个字符拼音首字符与返回字符串拼接 
SET tmp_str = SUBSTRING(tmp_str,2);#将tmp_str左端首字符去除 
SET tmp_len = LENGTH(tmp_str);#计算当前字符串长度 
END WHILE; 
RETURN tmp_rs;#返回结果字符串 
END;; 
DELIMITER ;

mysql 中文首字母检索 查询
 05/10 by admin
Advertisement
网上归纳总结,以防忘记

原理 根据 拼音的码表?。(不懂。。)反正一个声母的汉字的ASCII码都在一起?(不懂。。。)。然后在数据库中将要查询的汉字第一个字转化成码(不知道是什么码。。可能是ASCII码,反正跟字母表里的码是一个妈。。),然后来跟字母表对。next code。!

1,字母表

create table t_zmb( `zm` char primary key not null, `begin` smallint not null, `end` smallint not null )
1.1 导入字母数据

insert into t_zmb 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);
2,第一步大功告成了。然后只要一条小小的sql语句就收工了

select p.* from t_products p,t_zmb t where conv(hex(left(convert(ProName using GBK),1)),16,10) between t.begin and t.end and t.zm = 'A'
ok,就是这么简单。1,建表,2,编写sql。

实现按拼音首字母检索一种是直接增加字段存储名称首字母,但是这样会使表都一个字段,每次录入都要转换
这是通常的做法,另一种是接下来介绍的这种,按照汉字编码排序来实现的,无需给表多增字段
首先我们有一个这样的数组
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
array(
			'A'=>'吖',
			'B'=>'八',
			'C'=>'嚓',
			'D'=>'咑',
			'E'=>'妸',
			'F'=>'发',
			'G'=>'旮',
			'H'=>'铪',
			'J'=>'丌',
			'K'=>'咔',
			'L'=>'垃',
			'M'=>'嘸',
			'N'=>'拏',
			'O'=>'噢',
			'P'=>'妑',
			'Q'=>'七',
			'R'=>'呥',
			'S'=>'仨',
			'T'=>'他',
			'W'=>'屲',
			'X'=>'夕',
			'Y'=>'丫',
			'Z'=>'帀'
		);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

查出姓名拼音首字母是a的


`SELECT * FROM `tbl` WHERE CONVERT( name USING gbk ) COLLATE gbk_chinese_ci >='吖' AND CONVERT( name USING gbk ) COLLATE gbk_chinese_ci < '八'`


查出姓名拼音首字母是b的


`SELECT * FROM `tbl` WHERE CONVERT( name USING gbk ) COLLATE gbk_chinese_ci >='八' AND CONVERT( name USING gbk ) COLLATE gbk_chinese_ci < '嚓'`


...

查出姓名拼音首字母是z的


`SELECT * FROM `tbl` WHERE CONVERT( name USING gbk ) COLLATE gbk_chinese_ci >='z'`


原理:GBK编码是按读音排序的,UTF-8不是按读音排序的,因此我们将汉字转为gbk编码,只要知道拼音首字母的a到b的界限就可以查出所有首字母是a的姓名,以此类推,可以按上面的数组查出,至于英文字母26个为什么数组只有23个,只因为汉字姓名中没有以那三个字母开头的姓名,想深究的小伙伴可以参考[GBK编码表](http://ff.163.com/newflyff/gbk-list/)。


提示:CONVERT是将name转换成gbk编码(上面已经解释过了),如果你本来就是gbk编码的汉字,那CONVERT这个就可以省略了,我们通常用的是utf8

在yii1中使用如下

查出姓名拼音首字母是a的

$categoryA=Category::model()->findAll(array(
	'condition'=>"CONVERT( full_name USING gbk ) COLLATE gbk_chinese_ci   >='吖' AND CONVERT( full_name USING gbk ) COLLATE gbk_chinese_ci <'八'",
));

查询结果可以用片段缓存来缓存,提高速度

以上是关于sql 获取汉字首字母的函数.SQL的主要内容,如果未能解决你的问题,请参考以下文章

SQL 获取名字拼音

SQL Server 获取汉字的拼音首字母

sql中根据汉字的拼音首字母查询的函数

sql自动生成汉语拼音和首字母函数

SQL Server 如何提取汉字首字母

mysql数据库,获取某一个汉字的拼音的首字母。怎么整?