1. 生成 (获取) 字段第一个字符的首字母
-- 字符串P_NAME第一个字的拼音首字母,如果字符串P_NAME第一个字符为ascii码,则返回该的原值,如果P_NON_CN为真则非中文(如日文)也返回原值
drop function if exists firstPinyin;
CREATE FUNCTION `firstPinyin`(P_NAME VARCHAR(255),P_NON_CN BOOLEAN) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE V_RETURN VARCHAR(4);
DECLARE V_FIRST varchar(4);
DECLARE V_CHAR varchar(32);
-- 第一个字符
set V_FIRST= left(P_NAME,1);
-- 第一个字符编码
set V_CHAR = CONV(HEX(CONVERT(P_NAME USING gbk)),16,10);
-- 如果是数字和字母则返回原值,如果想ascii也返回空的话就改改下面的if
if V_CHAR <=127 then set V_RETURN = V_FIRST;
-- 否则对中文取拼音首字母,其他则为null
else
SET V_RETURN = ELT(INTERVAL(V_CHAR,
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');
if P_NON_CN and V_RETURN is null then set V_RETURN=V_FIRST; end if;
end if;
return V_RETURN;
END;
-- 示例:
select firstPinyin('@',false); -- @
select firstPinyin('5',false); -- 5
select firstPinyin('R',false); -- R
select firstPinyin('我',false); -- w
select firstPinyin('(',false); -- null值
select firstPinyin('(',true); -- (
2. 生成 (获取) 字段全部字符的首字母
-- 字符串P_NAME所有字的拼音首字母,注意长度限制为255,如果P_NON_CN为真则非中文(如日文)返回原值否则仅ascii返回原值
drop function if exists pinyin;
CREATE FUNCTION `pinyin`(P_NAME VARCHAR(255),P_NON_CN BOOLEAN) RETURNS varchar(255)
BEGIN
DECLARE V_COMPARE VARCHAR(255);
DECLARE V_RETURN VARCHAR(255);
DECLARE V_PINYIN1 varchar(4);
DECLARE I INT;
if P_NAME is null or P_NAME = '' then return ''; end if;
SET I = 1;
SET V_RETURN = '';
-- 循环每一个字符获取拼音首字母
while I <= char_length(P_NAME) do
SET V_COMPARE = SUBSTR(P_NAME, I, 1);
IF (V_COMPARE != '') THEN
set V_PINYIN1 = firstPinyin(V_COMPARE,P_NON_CN);
if V_PINYIN1 is not null and V_PINYIN1 != '' then
SET V_RETURN = CONCAT(V_RETURN, V_PINYIN1);
end if;
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;
-- 示例:
select pinyin('ほ#1&*@2我啊(大)]',false); -- #1&*@2wa(d]
select pinyin('ほ#1&*@2我啊(大)]',true); -- ほ#1&*@2wa(d)]
3. 例子:查询按照拼音首字母排序
3.1. 直接利用 convert 函数按照拼音首字母排序
-- 由于会全表扫描,在数据量大时不能满足查询速度需要
explain
select * from cust_base order by convert(cust_name using gbk) limit 10;
3.2. 利用专门的字段按照拼音首字母字段排序,并使用触发器自动生成拼音字段值
-- 添加字段
ALTER TABLE cust_base add column cust_name_pinyin varchar(6) not null default '' comment '客户名称拼音';
-- 插入时触发器
drop trigger if exists trigger_in_cust_base;
create trigger trigger_in_cust_base BEFORE INSERT on cust_base for each row
begin
declare v_pinyin varchar(255);
if new.cust_name_pinyin is null or new.cust_name_pinyin = '' then
set v_pinyin = pinyin(left(new.cust_name,6),false);
if v_pinyin is not null then
set new.cust_name_pinyin = v_pinyin;
end if;
end if;
end;
-- 修改时触发器
drop trigger if exists trigger_up_cust_base;
create trigger trigger_up_cust_base BEFORE update on cust_base for each row
begin
declare v_pinyin varchar(255);
if new.cust_name_pinyin is null or new.cust_name_pinyin = '' then
set v_pinyin = pinyin(left(new.cust_name,6),false);
if v_pinyin is not null then
set new.cust_name_pinyin = v_pinyin;
end if;
end if;
end;
-- 手工触发触发器生成拼音,以应用老数据
update cust_base set cust_name_pinyin='';
-- 创建索引以方便按拼音排序
create index idx_cust_name_pinyin on cust_base (cust_name_pinyin);
-- 执行查询,不会全表扫描
explain
select * from cust_base order by cust_name_pinyin limit 10;
微信视频投屏:
1、在手机端微信中会拦截投屏功能,需要首先点击视频页面右上角“...”图标,选择“在浏览器中打开”,在列表中选取具备投屏功能的浏览器,推荐使用QQ浏览器
2、在新打开的浏览器视频页面里,点击播放按钮,可在视频框右上角看到一个“TV”投屏小图标,只要电视和手机在同一WiFi环境下,点击按钮即刻享受大屏观感!
本站资源声明:
1、如需免费下载云盘资源,请先点击页面右上角的“登录”按钮,注册并登录您的账号后即可查看到网盘资源下载地址;
2、本站所有资源信息均由网络爬虫自动抓取,以非人工方式自动筛选长效资源并更新发布,资源内容只作交流和学习使用,本站不储存、复制、传播任何文件,其资源的有效性和安全性需要您自行判断;
3、本站高度重视知识产权保护,如有侵犯您的合法权益或违法违规,请立即向网盘官方举报反馈,并提供相关有效书面证明与侵权页面链接联系我们处理;
4、作为非盈利性质网站,仅提供网络资源的免费搜索和检测服务,无需额外支付其他任何费用,学习和交流的同时请小心防范网络诈骗。