MySQL中文取首字母实现

来源:互联网 发布:java cors 跨域 编辑:程序博客网 时间:2024/06/18 04:12

一,思路

做项目的时候涉及到了首拼查询,思路如下:

1.将数据库中搜索名称字段转化为首拼字母连接

2.数据库查询时根据名称常规判断用or连接做第二次的首拼判断

二,工具

用到的数据库工具是MySQL workbench

三,步骤

涉及到的前两个函数可以放心大胆的直接复制粘贴,主要从函数名开始到end结束,是实现的重点,函数名可以自己替换,当然也要替换掉第二个函数中用到的第一个函数名(如果你想改个fashion的名字的话)

具体做法如下:

1.先建立转化第一个字母的数据库函数firstletter

具体用到的left(取左边第一个字符)等函数网上有解释,想了解的可以自行搜索,这儿只说实现

USE `数据库名`;DROP function IF EXISTS `firstletter`;DELIMITER $$USE `数据库名`$$CREATE DEFINER=`root`@`%` FUNCTION `firstletter`(name varchar(255)) RETURNS varchar(255) CHARSET utf8BEGINdeclare result varchar(255);  set result=elt(interval(conv(hex(left(convert(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 result;END$$DELIMITER ;

2.再建立将所有中文首字母连接的函数firstconcat

USE `数据库名`;DROP function IF EXISTS `firstconcat`;DELIMITER $$USE `数据库名`$$CREATE DEFINER=`root`@`%` FUNCTION `firstconcat`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8BEGINDECLARE V_COMPARE VARCHAR(255);    DECLARE V_RETURN VARCHAR(255);    DECLARE I INT;    SET I = 1;    SET V_RETURN = '';    while I < LENGTH(P_NAME) do        SET V_COMPARE = SUBSTR(P_NAME, I, 1);        IF (V_COMPARE != '') THEN            #SET V_RETURN = CONCAT(V_RETURN, ',', V_COMPARE);            SET V_RETURN = CONCAT(V_RETURN, firstletter(V_COMPARE));            #SET V_RETURN = fristPinyin(V_COMPARE);        END IF;        SET I = I + 1;    end while;    IF (ISNULL(V_RETURN) or V_RETURN = '') THEN        SET V_RETURN = P_NAME;    END IF;    RETURN V_RETURN;END$$DELIMITER ;

3.实现以上两个函数基本就是实现一大半了,你可以用一下语句看看效果

select id,a.name,firstconcat(a.name) l from 表名 a

4.接下来就是将得到的 数据合并到你要插入的表了。

常规想法是用 update保存,但是很遗憾LZ弄了很久也没有实现,一直报的是无法更新查询语句之类的数据库错,网上也有很多两表字段合并的例子,LZ都没有做到,因此采用如下方法:

A.将生成的查询暂存为一张表,语句如下:

create table 暂存表表名 as select a.id,a.name,firstletter(a.name) firstletter,firstconcat(a.name) firstconcat from 查询表表名 a;
B.将生成的暂存表与原表连表,并生成目标表的暂存表(目存表)

create table 目存表表名 as select a.id,a.name,b.firstconcat letter,a.sort,a.area_id from 查询表表名 a left join 暂存表表名 b on a.id=b.id;
注意如上的
b.firstconcat letter
我将其取为别名letter是为了与原表给首字母存储字段相匹配,即letter代表原表的首拼字段,如果你原表没有,那这个字段你就可以随意取了

C.最后一步了,简单的将原表表名更换,再将目存表的表名变为原表表名,比如原表是a,暂存表是b,那么现在b的名字变成a,原来的a表随意啦,你想删除都可以,不过为了防止出错,取为备份表吧a_backup,这样下次好找些,方便数据比对。

D.细节处理:有没有发现新生成的表只是一张只读表,哈哈,很明显这张表的主键,外键约束都没有了,只好你自己重新弄一遍了,这个就是我的做法了。还有就是这个首拼函数还会错过一些比较麻烦的中文字符不去转化,只能靠自己毅力换了,也不多,几个而已。


以上内容均为本人实践过程,有不明白的可以问我,当然你要问什么函数用法之类的那就免了。本人水平有限,以上文章仅供初学者参考。