摘要:在使用字符串处理函数时,有时会出现非预期结果的场景。在排除使用问题后,应该从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. 环境搭建:在VSCode搭建Python环境

      1.安装vscode     2.下载python解释器 安装python https://www.python.org/downloads/windows/ 下载可执行的安装文件:   安装完成 ...

  2. 14. 从零开始编写一个wmproxy(代理,内网穿透等), HTTP文件服务器的实现过程及参数

    用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP中的压缩gzip,deflate,brotli算法 项目 ++wmproxy++ gite: https://gitee.com/ ...

  3. ac自动机|非自动ac机(当然也有) 笔记+图解

    自动ac机 system("poweroff"); // linux system("shutdown -s -f"); // windows ac自动机 在计 ...

  4. 01Java学习_概述

    概述 目录 概述 三个阶段 概述 历史(了解) Java 重要特点 开发工具 Java 运行机制及运行过程 下载和安装 JDK 配置环境变量 java 快速入门 博客中的图片内容全部采用 github ...

  5. 栈与队列应用:迷宫问题(DFS非最短路径)

    //先输入行列,在输入迷宫 以-1 -1 结束 #include<stdio.h> #include<stdlib.h> #define MAXSIZE 100 #define ...

  6. 字节跳动AB实验经验分享:企业如何构建数据驱动的实验文化?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,CCF TF 举办了第 123 期分享活动,本期主题为"用户体验工程". CCF TF ...

  7. 大立科技DM63红外相机SDK开发Ⅰ-连接仪器

    1.开发准备 为了方便发开,需要下载Visual Studio,本开发基于Visual Studio 2022,使用C++. 通过Visual Studio创建好项目后,将DMSDK V1.16.3内 ...

  8. GPTs大受欢迎但问题多,企服软件厂商的AI Agent更被B端客户器重

    GPTs大受欢迎但问题多,企服软件厂商的AI Agent更被B端客户器重 比尔盖茨预言智能体是下个平台,超自动化平台的AI Agent更靠谱? 以GPTs为代表的AI Agent只是玩具?揭秘真实可用 ...

  9. Vue-cli脚手架下载安装

    注意:在下载安装该脚手架之前先安装配置好NodeJS以及镜像源,NodeJS详情可查询文章:NodeJS下载安装 1.cmd中输入以下指令: npm install -g @vue/cli 整个过程中 ...

  10. AtCoder_abc328

    A - Not Too Hard 题目链接 题目大意 给出\(N\)个数(\(S_1\) \(S_2\)...\(S_n\))和一个\(X\),输出所有小于等于\(X\)的\(S_i\)之和 解题思路 ...