GaussDB(DWS)字符串处理函数返回错误结果集排查
摘要:在使用字符串处理函数时,有时会出现非预期结果的场景。在排除使用问题后,应该从encoding和数据本身开始排查。
本文分享自华为云社区《GaussDB(DWS)字符串处理函数返回错误结果集排查》,作者: -CHEN111- 。
在使用字符串处理函数时,有时会出现非预期结果的场景。在排除使用问题后,应该从encoding和数据本身开始排查。
直接从案例出发。
(一)案例背景
客户执行instr查空格下标,子查询中查询结果与将子查询的结果粘出来单独执行结果集不一致。
SELECT instr((SELECT a FROM t1), ' ') xxxxx;
SELECT a FROM t1; 的结果是a -> SELECT instr(a, ' ');
假设当前select a from t1;通过数据库连接客户端查询后显示结果集为“测试测 试 测试”
SELECT instr((SELECT a FROM t1), ' '); --结果为6
SELECT instr('测试测 试 测试', ' '); --结果为4
(二)问题排查
从上述结果集中可以看出,如果把SELECT a FROM t1;的结果集单独复制出来,则其结果4为预期结果,而当SELECT a FROM t1;作为子查询进行instr处理时,结果为6是不符合预期的。
排查主要从encoding和子查询结果集入手
1.先判断encoding
不同的编码类型下,字符串处理也不相同。
- UTF8是按字符算个数
- SQL_ASCII是按字节算个数
对于“测试测 试 测试”而言,按字符个数计算,SELECT instr('测试测 试 测试', ' ')的结果应为4;按字节个数计算,一个汉字占3个字节,SELECT instr('测试测 试 测试', ' ')的结果应为10。
查看当前库编放码类型
SHOW server_encoding;
结果为UTF8,故预期结果应该为4,但是SELECT instr((SELECT a FROM t1), ' ');结果却为6。
此时开始怀疑是否是客户端查询导致字符串结果集显示错误
2. 子查询结果集排查
通过编解码拿到字符串结果集的十六进制
SELECT encode(a, 'hex') AS res FROM t1;
res
------------------------------------------
e6b58be8af95e6b58b0d0ae8af9520e6b58be8af95
(1 row)
在本地解码后结果集为
SELECT convert_from(decode('e6b58be8af95e6b58b0d0ae8af9520e6b58be8af95','hex'),'utf8');
convert_from
--------------
测试测\r +
试 测试
可以看出,字符串结果集中,‘测试测’后并非空格,而是’\r +’。
3. 解决方案
将’\r +'按照编解码的形式替换空格
SELECT instr((SELECT a FROM t1), convert_from(decode('0d0a','hex'),'utf8'));
此时结果为4,为客户预期结果。
GaussDB(DWS)字符串处理函数返回错误结果集排查的更多相关文章
- MSSQLSERVER数据库- 字符串分割函数返回类型表
遇到这样一个问题,存储在数据库的数据是一串字符串如:1,2,3,4,5,6.想把这串字符串进行转变成一个表格,如下: 1 2 3 4 5 6 就是这样一个问题,有人同事,写了一个这样的封装函数,这样就 ...
- TCP连接connect函数返回错误
如果是 TCP 套接字,那么调用 connect 函数将激发 TCP 的三次握手过程,而且仅在连接建立成功或出错时才返回.其中出错返回可能有以下几种情况: 三次握手无法建立,客户端发出的 SYN 包没 ...
- postgresql数据库利用函数返回查询结果集
- Linux 字符串处理函数
1 strchr 函数原型:extern char *strchr(char *str,char character) 参数说明:str为一个字符串的指针,character为一个待查找字符. ...
- 从数据仓库双集群系统模式探讨,看GaussDB(DWS)的容灾设计
摘要:本文主要是探讨OLAP关系型数据库框架的数据仓库平台如何设计双集群系统,即增强系统高可用的保障水准,然后讨论一下GaussDB(DWS)的容灾应该如何设计. 当前社会.企业运行当中,大数据分析. ...
- PHP开发中常用的字符串操作函数
1,拼接字符串 拼接字符串是最常用到的字符串操作之一,在PHP中支持三种方式对字符串进行拼接操作,分别是圆点.分隔符{}操作,还有圆点等号.=来进行操作,圆点等号可以把一个比较长的字符串分解为几行进行 ...
- ajax提交后完全不进入action直接返回错误
今天遇到个问题就是jQuery提交ajax请求,居然没有进入action的断点而直接返回错误信息. 仔细排查后才发现原来是因为客户端提交的某字段是100w的值,而后台对应的字段是个Short类型,根本 ...
- mysqli_fetch_row()函数返回结果的理解
在PHP处理对数据库查询返回的结果集,即mysqli_query()函数返回的结果集,我们可以把它处理为数组形式以便于处理. 我们一般会用下面四个函数: 1.array mysqli_fetch_ar ...
- C语言中函数返回字符串的四种方法
在讨论着四种方法之前,首先要对函数有一个简单的认识,无论是在形实结合时,还是在return语句返回时,都有一个拷贝的过程.你传进来的参数是个值,自然函数在工作之前要把这个值拷贝一份供自己使用,你传进来 ...
- C语言中函数返回字符串的4中方法
C语言中函数返回字符串的4中方法 函数的构成部分:返回类型.函数名称.参数.函数主体 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参 形参的作用在于接收实参传入的值,形参和函数内部的其 ...
随机推荐
- 【分段传输】c#使用IAsyncEnumerable实现流式分段传输
引言 在使用SSE的时候,前端可以实现流式传输,但是有个问题就是这是一个独占的连接,相当于如果你不手动关闭连接,就会一直请求,一直连接调用接口,而且发送的数据格式也是按照定义好的协议来,而使用c#自带 ...
- 后缀自动机 (SAM) 的构造及应用
cnblogs 怎么又炸了. 为什么又可爱又强的 xxn 去年 9 月就会的科技樱雪喵现在还不会呢 /kel. 感觉 SAM 的教程已经被前人写烂了啊.那就写点个人学习过程中对 SAM 的理解. 参考 ...
- CF1333A [Little Artem]
Problem 题目简述 给你一个 \(n \times m\) 的方格,构造一个方案,使得方案中 \(B = W + 1\). \(B\):相邻的格子有至少一个白色格子的黑色格子的个数. \(W\) ...
- 深度解析BERT:从理论到Pytorch实战
本文从BERT的基本概念和架构开始,详细讲解了其预训练和微调机制,并通过Python和PyTorch代码示例展示了如何在实际应用中使用这一模型.我们探讨了BERT的核心特点,包括其强大的注意力机制和与 ...
- 使用Python将MySQL查询结果导出到Excel(xlsxwriter)
在实际工作中,我们经常需要将数据库中的数据导出到Excel表格中进行进一步的分析和处理.Python中的pymysql和xlsxwriter库提供了很好的解决方案,使得这一过程变得简单而高效. 建立数 ...
- 【re】[NISACTF 2022]string --linux下的随机数
附件下载,查壳 发现是ELF程序,64位,ida打开分析 flag函数点进去 前面一堆代码其实都不重要,直接看主要代码: puts("The length of flag is 13&qu ...
- 手撕Vuex-安装模块方法
前言 经过上一篇文章的介绍,我们实现了将模块安装到 store 中,那么本章我们就来介绍一下怎么安装模块当中的方法也就是 actions.mutations.getters. 所以本次文章的目标就是将 ...
- 关于微信小程序中如何实现数据可视化-echarts动态渲染
移动端设备中,难免会涉及到数据的可视化展示.数据统计等等,本篇主要讲解原生微信小程序中嵌入echarts并进行动态渲染,实现数据可视化功能. 基础使用 首先在GitHub上下载echarts包 地址: ...
- 3C智能移动周边产品龙头企业如何集成企业内部所有异构系统数据
全面并自动集成品胜集团全域业务系统中的各类业务数据:结构化.标准化.自动化集团全部异构系统数据,提升全公司整体项目管理水平:梳理与简化跨部门.跨系统流程,清晰定义流程节点及业务边界,打通部门间信息流通 ...
- 【Javaweb】Servlet十 | HttpServletResponse类和HttpServletRequest类
HttpServletResponse类的作用 HttpServletResponse类和HttpServletRequest类一样.每次请求进来,Tomcat服务器都会创建一个Response对象传 ...