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.细节处理:有没有发现新生成的表只是一张只读表,哈哈,很明显这张表的主键,外键约束都没有了,只好你自己重新弄一遍了,这个就是我的做法了。还有就是这个首拼函数还会错过一些比较麻烦的中文字符不去转化,只能靠自己毅力换了,也不多,几个而已。
以上内容均为本人实践过程,有不明白的可以问我,当然你要问什么函数用法之类的那就免了。本人水平有限,以上文章仅供初学者参考。
阅读全文
0 0
- MySQL中文取首字母实现
- JS取中文字符串首字母
- 取中文的拼音首字母
- Oracle 中文取首字母自定义函数
- mysql按中文首字母排序
- MYSQL按中文首字母排序
- 获取中文首字母mysql函数
- mysql 查询中文首字母开头
- Mysql 如何判断中文首字母
- java实现中文汉字的首字母排序
- java实现中文汉字的首字母排序
- 【Java】实现按中文首字母排序
- java实现中文汉字的首字母排序
- java实现中文汉字按首字母排序
- java实现中文汉字的首字母排序
- 获取中文大写首字母java实现
- java实现中文汉字的首字母排序
- java实现提取中文的首字母
- 微信服务器配置(nginx+python+supervisord, etc:java)
- PHP实现多服务器SESSION共享
- 【动画】上下滑动
- HTML中的行级标签和块级标签
- Spring SSH
- MySQL中文取首字母实现
- MySQL存储过程实现更新UUID
- VirtualPlanetBuilder入门简介
- 添加对私有数据成员的支持
- 《Metasploit 魔鬼训练营》博客目录
- 客观题 编程综合
- java文件上传
- 题目1041:Simple Sorting
- 把库转换为一个jQuery插件