登录 |

MySQL获取汉字拼音首字母函数

2008年03月14日 下午 16:58 | 作者:

做价格数据库(http://cms.xxty.cn/price),农产品搜索提示需要支持字母,网上的mysql函数只支持单个汉字,另外SQL也写得不规范,重写:支持多个汉字。
用法:
SELECT pinyin(‘精神鸦片’);
=> JSYP

DROP TABLE IF EXISTS `pinyin`;

CREATE TABLE `pinyin` (
  `letter` char(1) NOT NULL,
  `chinese` char(1) NOT NULL,
  PRIMARY KEY  (`letter`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

insert  into `pinyin`(`letter`,`chinese`) values 
('A','驁'),
('B','簿'),
('C','錯'),
('D','鵽'),
('E','樲'),
('F','鰒'),
('G','腂'),
('H','夻'),
('J','攈'),
('K','穒'),
('L','鱳'),
('M','旀'),
('N','桛'),
('O','漚'),
('P','曝'),
('Q','囕'),
('R','鶸'),
('S','蜶'),
('T','籜'),
('W','鶩'),
('X','鑂'),
('Y','韻'),
('Z','咗');

DELIMITER $$

DROP FUNCTION IF EXISTS `PINYIN`$$

CREATE FUNCTION `PINYIN`(str CHAR(255)) RETURNS char(255)
BEGIN
DECLARE hexCode char(4);
DECLARE pinyin varchar(255);
DECLARE firstChar char(1);
DECLARE aChar char(1);
DECLARE pos int;
DECLARE strLength int;

SET pinyin    = '';
SET strLength = CHAR_LENGTH(LTRIM(RTRIM(str)));
SET pos       = 1;
SET @str      = (CONVERT(str USING gbk));
WHILE pos <= strLength DO
        SET @aChar = SUBSTRING(@str,pos,1);
        SET hexCode = HEX(@aChar); 

	IF hexCode >= "8140" AND hexCode <= "FEA0" THEN   
		SELECT letter into firstChar
		FROM   pinyin   
		WHERE  chinese >= @aChar
		LIMIT  1;
        END IF;

	SET pinyin = CONCAT(pinyin,firstChar);
	SET pos = pos + 1;
END WHILE;  
     
RETURN UPPER(pinyin);
END$$

DELIMITER ;

世界上最长的SQL

2006年08月11日 上午 32:40 | 作者:

北京英迪华科技有限公司 版权所有

查看全文 »

SQL分页查询优化

2005年11月23日 下午 39:24 | 作者:

如下基础分页方案

select top 页大小 *
from table1
where id >
(select max (id) from
(select top ((页码-1)*页大小) id from table1 order by id) as T --瓶颈
)
order by id


查看全文 »