目录

一、思路

二、工具

三、步骤

第一步

第二步

第三步

四、参考文章


一、思路

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

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

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

二、工具

用到的数据库工具是MySQL workbench

mysql 汉字首字母检索 mysql获取汉字首字母_表名

三、步骤

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

具体做法如下:

第一步

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

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

注:拼音首字母生成过程:
    1) 先将编码转换为GBK编码,取汉字的首个单词转为十六进制表示
    2) 将首字符的十六进制转化为十进制表示为值X
    3) 使用interval返回第一个大于 被比较元素X 的位置index,该函数的比较列表为英文字母的十六进制编码值(汉字的编码是按照英文字母排序范围的)
    4) 使用ELT函数将上一步获得的位置index,按照英文字母字符的排序位置输出汉字首字母

函数使用说明:

函数INTERVAL(N,N1,N2,N3,..........): INTERVAL()函数进行比较列表(N1,N2,N3等等)中的N值。该函数如果N<N1返回0,如果N<N2返回1,如果N<N3返回2 等等。如果N为NULL,它将返回-1。列表值必须是N1<N2<N3的形式才能正常工作。

函数ELT(N,str1,str2,str3,...) :如果N= 1,返回str1,如果N= 2,返回str2,等等。如果N小于1或大于参数个数,返回NULL

USE `数据库名`;
DROP function IF EXISTS `firstletter`;

DELIMITER $$
USE `数据库名`$$
CREATE DEFINER=`root`@`%` FUNCTION `firstletter`(name varchar(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
declare 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

使用while循环分割每个字符串的汉字为一个个单词,然后使用第一步中的firstletter将汉字转为英文字母(若是想处理复杂的字符即非汉字字符的情况--不想转化、跳过,只需在分割的过程中使用interval函数按照的字符编码判断是否落在范围内即可)

USE `数据库名`;
DROP function IF EXISTS `firstconcat`;

DELIMITER $$
USE `数据库名`$$
CREATE DEFINER=`root`@`%` FUNCTION `firstconcat`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE 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

mysql 汉字首字母检索 mysql获取汉字首字母_mysql 汉字首字母检索_02


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

 

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

四、参考文章

[1] MySQL数据库获取汉字拼音的首字母函数


[2] MySQL数据库获取多个汉字拼音的首字母函数