摘要:在使用字符串处理函数时,有时会出现非预期结果的场景。在排除使用问题后,应该从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)字符串处理函数返回错误结果集排查的更多相关文章

  1. MSSQLSERVER数据库- 字符串分割函数返回类型表

    遇到这样一个问题,存储在数据库的数据是一串字符串如:1,2,3,4,5,6.想把这串字符串进行转变成一个表格,如下: 1 2 3 4 5 6 就是这样一个问题,有人同事,写了一个这样的封装函数,这样就 ...

  2. TCP连接connect函数返回错误

    如果是 TCP 套接字,那么调用 connect 函数将激发 TCP 的三次握手过程,而且仅在连接建立成功或出错时才返回.其中出错返回可能有以下几种情况: 三次握手无法建立,客户端发出的 SYN 包没 ...

  3. postgresql数据库利用函数返回查询结果集

  4. Linux 字符串处理函数

    1 strchr 函数原型:extern char *strchr(char *str,char character) 参数说明:str为一个字符串的指针,character为一个待查找字符.     ...

  5. 从数据仓库双集群系统模式探讨,看GaussDB(DWS)的容灾设计

    摘要:本文主要是探讨OLAP关系型数据库框架的数据仓库平台如何设计双集群系统,即增强系统高可用的保障水准,然后讨论一下GaussDB(DWS)的容灾应该如何设计. 当前社会.企业运行当中,大数据分析. ...

  6. PHP开发中常用的字符串操作函数

    1,拼接字符串 拼接字符串是最常用到的字符串操作之一,在PHP中支持三种方式对字符串进行拼接操作,分别是圆点.分隔符{}操作,还有圆点等号.=来进行操作,圆点等号可以把一个比较长的字符串分解为几行进行 ...

  7. ajax提交后完全不进入action直接返回错误

    今天遇到个问题就是jQuery提交ajax请求,居然没有进入action的断点而直接返回错误信息. 仔细排查后才发现原来是因为客户端提交的某字段是100w的值,而后台对应的字段是个Short类型,根本 ...

  8. mysqli_fetch_row()函数返回结果的理解

    在PHP处理对数据库查询返回的结果集,即mysqli_query()函数返回的结果集,我们可以把它处理为数组形式以便于处理. 我们一般会用下面四个函数: 1.array mysqli_fetch_ar ...

  9. C语言中函数返回字符串的四种方法

    在讨论着四种方法之前,首先要对函数有一个简单的认识,无论是在形实结合时,还是在return语句返回时,都有一个拷贝的过程.你传进来的参数是个值,自然函数在工作之前要把这个值拷贝一份供自己使用,你传进来 ...

  10. C语言中函数返回字符串的4中方法

    C语言中函数返回字符串的4中方法 函数的构成部分:返回类型.函数名称.参数.函数主体 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参 形参的作用在于接收实参传入的值,形参和函数内部的其 ...

随机推荐

  1. DHCP和PXE是怎么工作的

    dhcp(Dynamic Host Configuration Protocol):配置一段共享IP地址,为新上线的机器分配IP地址,回收下线机器的IP地址. 正常情况下主机(DHCP client) ...

  2. Linux发行版部分时间线

  3. OI 学习笔记 I:图论(更新中)

    阅读时建议在右下角开启目录. 由于作者的数学水平限制和篇幅限制,有些结论可能仅给出感性理解或不给出证明,有疑惑的读者可以百度答案或者前往参考资料一栏查找. 另外,因为图论的内容比较杂,有些与树相关的算 ...

  4. 关于PaddleOCR识别时中文路径导致报错/没输出结果

    此处只做学习PaddleOCR时遇到的一些坑 一.Python版本与PaddleOCR兼容性问题 如果你在Python11的环境下安装PaddlePaddle,使用 paddleocr --image ...

  5. QSplitter 自我总结

    ①.QSplitter(QWidget* parent = Q_NULLPTR); //构造函数 QSplitter(Qt::Orientation orientation , QWidget* pa ...

  6. JavaScript 语法:注释与输入 / 输出

    作者:WangMin 格言:努力做好自己喜欢的每一件事 JavaScript 注释 JavaScript 注释用于解释 JavaScript 代码,提高代码的可读性,也可以用于在测试替代代码时阻止执行 ...

  7. markdown语法基本使用

    markdown 语法基本使用 目录 markdown 语法基本使用 各级标题 字体 引用 分隔线 图片 列表 表格 代码 超链接 各级标题 井号加上空格,几级标题用几个井号加上空格 字体 单星号引起 ...

  8. mysql group by 执行原理及千万级别count 查询优化

    大家好,我是蓝胖子,前段时间mysql经常碰到慢查询报警,我们线上的慢sql阈值是1s,出现报警的表数据有 7000多万,经常出现报警的是一个group by的count查询,于是便开始着手优化这块, ...

  9. 如何从Webpack迁移到Vite

    本文将介绍如何将前端web应用程序从 Webpack 升级到 Vite. Vite 是最新的前端开发工具,其受欢迎程度和采用率都在大幅增长.可以查看下图中来自 npm trends 的下载. 推动这一 ...

  10. freeswitch如何解决sip信令的NAT问题

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 公网环境复杂多变,客户环境更是各种稀奇古怪的问题. fs在针对sip信令的NAT问题有针对性的参数设置. 本文讨论的范围限于fs的公 ...