【Teradata UDF】中文按字符查找chs_instr
一.场景描述
数据库为ASCII编码单字节存储,在查询中文时可能会出现错误结果。例如查询like“房”字,会查询出不含“房”,含“朔科”的结果。
select * from Tablename01 where name like '%房%';
二.原因分析
一个汉字为2个字符,“朔”的第二个字节与“科”的第一个字节,正好与“房”的两个字节相同。查看十六进制,如下:
select char2hexint('房'); --00B7 00BF
select char2hexint('朔科'); --00CB 00B7 00BF 00C6
三.解决方案
1.安装部署自定义函数chs_instr
chs_instr(参数1,参数2)是一个C编写的自定义函数,它的功能是在参数1中查找参数2,按照参数2的字节数去查找,如果查询不到则返回0,查询到则返回大于0的值。
经查在Teradata库中,使用此UDF函数与like比较,IO数基本不变,CPUTime突增近100倍。所以,遇到此类问题时,优先考虑从设计层面规避like中文。
2.语句【name like ‘%房%’】替换成【chs_instr(name,'房')>0】
四.UDF安装部署
Teradata支持C语言的自定义函数。具体部署方法如下:
1、如下UDF存储到文件中,文件名称为chs_instr.udf
/*
database syslib;
replace FUNCTION chs_instr(srcStr VARCHAR(1024), childStr VARCHAR(64))
RETURNS INTEGER
LANGUAGE C
NO SQL
PARAMETER STYLE TD_GENERAL
EXTERNAL NAME chs_instr;
sel chs_instr('弢1234|', '|');
sel index('弢1234|', '|');
*/
2、如下为UDF定义中引用的C函数,文件名称为chs_instr.c
#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include <string.h>
/* Result is 0, if search_str does not apper in source_string */
/* index, a pos(start at 1) to the firt occurrence of search_str of source_string */
void chs_instr(VARCHAR_LATIN *source_string,VARCHAR_LATIN *search_str,
int *result,
char sqlstate[])
{
unsigned char *src = source_string, *sub = search_str, c;
int sublen = strlen(sub);
int slen = strlen(src);
int spos = ;
*result = ;
while ( spos <= slen-sublen ) {
if (memcmp(src+spos, sub, sublen) == ) {
*result = spos+;
break;
}
c = src[spos++];
if (c > ) spos++;
}
return;
}
3、使用bteq登录数据库(dbc用户),指定UDF默认存储数据库为syslib。
bteq "logon citic/dbc,dbc" < chs_instr.udf
附录:memcmp函数是按字节比较的。
s1,s2为字符串时候memcmp(s1,s2,1)就是比较s1和s2的第一个字节的ascII码值;
memcmp(s1,s2,n)就是比较s1和s2的前n个字节的ascII码值;
如:char *s1="abc";
char *s2="acd";
int r=memcmp(s1,s2,3);
就是比较s1和s2的前3个字节,第一个字节相等,第二个字节比较中大小已经确定,不必继续比较第三字节了。所以r=-1.
【Teradata UDF】中文按字符查找chs_instr的更多相关文章
- js 中文长字符截短&关键字符隐藏 自定义过滤器
两个非常简单的过滤器:隐藏关键字符和字符截短.同样也可以迁移到ng和原生js直接使用(去掉avalon.filters声明即可).后期还有不错的过滤器,还往这里面加 keyword:avalon,js ...
- SQL Server判断某个字段是否包含中文/英文字符/数字
原文:SQL Server判断某个字段是否包含中文/英文字符/数字 因最近在清理系统中的脏数据,需要查询某个字段是否包含中文/英文字符/数字的数据, 比较简单,仅以此篇博客做一个简单总结,方便以后查阅 ...
- python对不同类型文件(doc,txt,pdf)的字符查找
python对不同类型文件的字符查找 TXT文件: def txt_handler(self, f_name, find_str): """ 处理txt文件 :param ...
- Oracle instr() 字符查找函数
instr()函数的格式 (俗称:字符查找函数) 格式一:instr( string1, string2 ) / instr(源字符串, 目标字符串) 格式二:instr( string1 ...
- 【Teradata UDF】MD5加密
使用参考:Teradata自定义函数UDF(chs_instr) 源码下载:百度网盘链接
- 【mysql】利用全文索引实现中文的快速查找
现在我们数据库表中的记录大约在17万,每一条记录都有name字段,根据name做模糊匹配,效率非常低下. 表结构如下: create table T ( id int, name ) ); 总数据量如 ...
- 如何在windows的DOS窗口中正常显示中文(UTF-8字符)
打开CMD.exe命令行窗口,通过 chcp命令改变代码页 UTF-8的代码页为65001,ANSI/OEM - 简体中文 GBK为936,window default OEM - 美国为437 如果 ...
- python利用utf-8编码判断中文英文字符(转)
下面这个小工具包含了判断unicode是否是汉字.数字.英文或者其他字符,全角符号转半角符号,unicode字符串归一化等工作. #!/usr/bin/env python # -*- coding: ...
- python(40):利用utf-8编码判断中文英文字符
#!/usr/bin/env Python # -*- coding:GBK -*- """汉字处理的工具: 判断unicode是否是汉字,数字,英文,或者其他字符. 全 ...
随机推荐
- Nancy in .NET Core学习笔记 - 路由
前文中,我介绍了Nancy的来源和优点,并创建了一个简单的Nancy应用,在网页中输出了一个"Hello World",本篇我来总结一下Nancy中的路由 Nancy中的路由的定义 ...
- 从零开始学习PYTHON3讲义(四)让程序更友好
<从零开始PYTHON3>第四讲 先看看上一讲的练习答案. 程序完成的是功能,功能来自于"程序需求"("需求"这个词忘记了什么意思的去复习一下第二讲 ...
- K60平台智能车开发工作随手记
(图片仅为示例,并不一定固定为这种造型) 第十二届全国大学生智能汽车竞赛有一个分项是光电四轮车的竞速(任务A),Seven她们组采购到的配件使用了freescale Crotex-M4内核的CPU,T ...
- 从锅炉工到AI专家(3)
剖析第一个例子 学习<机器学习>,很多IT高手是直接去翻看TensorFlow文档,但碰壁的很多.究其原因,TensorFlow的文档跨度太大了,它首先假设你已经对"机器学习&q ...
- TypeScript 素描 - 模块、命名空间
/* 其实前面一些都是废话,因为都和C#类似.从模块开始就需要深入的去理解了 文档反复声明了 内部模块现在称做 命令空间 外部模块称为 模块 模块在其自身的作用域里执行,而不是在全局作用域里,也就是说 ...
- 详解 Symbol 类型
ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制,保证 ...
- 以最简单的方式讲HashMap
以最简单的方式讲HashMap HashMap可以说是面试中最常出现的名词,这次头条的一面,第一个问的问题就是HashMap.所以就让我们来探讨下HashMap吧. 实验环境:JDK1.8 首先先 ...
- .NET Http请求
声明:本代码只是我使用的网络请求方式的封装,大家如果有其他的可以一起讨论讨论. 本代码可以在.NET 与.NET CORE的平台下无须做任何改动(除非手动加一些必要的引用,resharper会有 ...
- Java对Excel数据处理(利用POI解析Excel)
前言 研究生复试结束我在学校官网上看到了全校按姓氏排列的拟录取名单,但是官网并没有给出每个人的专业,只有学号,另外还知道本专业的复试名单,所以我想知道对于本专业的拟录取名单.具体做法就是,扫描复试名单 ...
- 【Java千问】你了解代理模式吗?
代理模式详解 1 什么是代理模式? 一句话描述:代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 详细描述: 1.理论基础-代理模式是设计原则中的“开闭原则 ...