今天要做一个排序,有中文和英文的,数据库采用utf8编码,排除来的不对,所以需要将中文转换成中文的第一个字母,然后来排序
先小小的看一下mysql的自定义函数
DROP FUNCTION IF EXISTS `fntable`;##如果存在就删除 delimiter $$ ##函数开始 CREATE FUNCTION fntable( ##定义函数名 param_1 varchar(50),## 定义参数 param_2 varchar(50)##定义第二个参数 ) RETURNS VARCHAR(50) ##返回结果 BEGIN##函数体开始 DECLARE total VARCHAR(50);##定义变量 SET total=param_1;##赋值 return total;##返回结果 end $$##函数体结束
这是个小函数,可以从这个小函数上慢慢增加最后写出来自定义函数
我开始学编程的第一个程序,并不是helloword,是从1+到100.这里补充一个小函数也是从1开始加,加到n,mysql函数
DROP FUNCTION IF EXISTS `fntable`; delimiter $$ CREATE FUNCTION fntable( temp_n int ) RETURNS INT BEGIN DECLARE total int; DECLARE temp_i int; SET total=0; SET temp_i=0; while temp_i < temp_n do begin SET temp_i=temp_i+1; SET total=temp_i+total; END; END WHILE; RETURN total; end $$ select fntable(100);如果掌握了一门语言,这个还是很好理解啦
上面都是mysql的sql语句语法。函数体内可以使用sql语句,还有别的,一样有循环语句,if判断什么的,应该很好理解
然后汉字转换成首字母的sql语句:,这里注意的是,GBK的编码的一级编码才是按照拼音排序的,也就是说有一部分返回的首字母是不正确的,但姓名所用到的字不多,所以可以使用这种方式
SELECT ELT(INTERVAL(CONV(HEX(CONVERT('当' USING gbk)),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')结果为D
然后一个个从传递过来的字符串里将字符串里的中文一个个转换即可,然后装载一个varchar的变量里面,返回即可
这里从网上找到一个现成可以用的,写的不错 网址:http://www.jb51.net/article/53397.htm
DROP FUNCTION IF EXISTS `PYIN`; DELIMITER $$ CREATE FUNCTION `PYIN`(in_string VARCHAR(20)) RETURNS mediumtext CHARSET utf8 BEGIN DECLARE tmp_str VARCHAR(20) 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(20) 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(CONVERT(tmp_char USING gbk)),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 $$