首页 > 其他分享 >GaussDB(DWS)字符串处理函数返回错误结果集排查

GaussDB(DWS)字符串处理函数返回错误结果集排查

时间:2023-05-06 15:34:55浏览次数:55  
标签:DWS instr GaussDB 结果 t1 测试 字符串 处理函数 SELECT

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

 

点击关注,第一时间了解华为云新鲜技术~

标签:DWS,instr,GaussDB,结果,t1,测试,字符串,处理函数,SELECT
From: https://www.cnblogs.com/huaweiyun/p/17377489.html

相关文章

  • GaussDB(DWS)网络流控与管控效果
    摘要:本文主要介绍GaussDB(DWS)网络流控能力,并对其管控效果进行验证。本文分享自华为云社区《GaussDB(DWS)网络流控与管控效果》,作者:门前一棵葡萄树。上一篇博文GaussDB(DWS)网络调度与隔离管控能力,我们详细介绍了GaussDB网络调度逻辑,并简单介绍了如何应用网络隔离管控能力。本篇......
  • MFC-SetWindowLong设置窗口样式、窗口标识符ID、处理函数
     修改样式LONGStyles;Styles=GetWindowLong(hWnd4,GWL_STYLE);//获取原窗口风格/*参数1:HWNDhWnd窗口句柄参数2:intnIndex改变窗口上的何种属性*/LONGl=SetWindowLong(hWnd4,GWL_STYLE,Styles|LVS_REPORT);//设置新的......
  • MFC-GetWindowLong获取窗口样式、窗口标识符ID、处理函数
     获取窗口样式LONGStyles=GetWindowLong(hWnd4,GWL_STYLE);//获取窗口风格/*参数1:HWNDhWnd窗口句柄参数2:intnIndex改变窗口上的何种属性窗口属性包括窗口的样式(GWL_STYLE)、扩展样式(GWL_EXSTYLE)、窗口函数、窗......
  • 华为云GaussDB坚持技术引领,以数字化转型激活金融科技新动能
    摘要:“银行业数字化转型实践交流会”杭州站顺利收官。由华为与北京先进数通联合主办的“银行业数字化转型实践交流会”杭州站顺利收官,会议邀请了金融科技先锋企业、机构和多位资深专家,一起深入交流银行业数字化转型业务场景的探索和实践。其中,华为云数据库专家在现场分享了华为云Ga......
  • 无惧百万级并发,GaussDB(for Cassandra)让华为推送服务更快触达
    摘要:推送服务(PushKit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道。通过集成推送服务,您可以向客户端应用实时推送消息,让应用更精准触达用户,是开发者提升用户感知度和活跃度的一件利器。本文分享自华为云社区《无惧百万级并发,GaussDB(forCassandra)让华为Push推送服......
  • 华为云GaussDB支撑华为MetaERP系统全面替换
    摘要:目前MetaERP已经覆盖了华为公司100%的业务场景和80%的业务量。本文分享自华为云社区《强渡大渡河!华为云GaussDB支撑华为MetaERP系统全面替换》,作者:华为云头条。近日,在“英雄强渡大渡河”MetaERP表彰会上,华为宣布实现自主可控的MetaERP研发,并完成对旧ERP系统的替换,目前MetaE......
  • 再获殊荣!华为云GaussDB喜提“科技进步一等奖”
    摘要:近日,中国电子学会科学技术奖励大会颁发了2021-2022年度中国电子学会科学技术奖获奖项目,华为云主导的“GaussDB智能云原生分布式数据库”项目荣获“科技进步一等奖”。本文分享自华为云社区《再获殊荣!华为云GaussDB喜提“科技进步一等奖”》,作者:GaussDB数据库。近日,中国电......
  • 详解GaussDB(DWS)的query_band负载识别与应用
    摘要:query_band是一个会话级别(session)的GUC参数,本身是字符串类型,支持任意形式字符组合。本文分享自华为云社区《GaussDB(DWS)的query_band负载识别与应用》,作者:门前一棵葡萄树。query_band概述GaussDB(DWS)实现了基于query_band的负载识别和优先级调度,一方面提供了更为灵活......
  • 常用字符串处理函数
    1split以某一字符来分割字符串  2substring从第零位截取前五个去掉前六个字符3操作数组 ......
  • GaussDB(DWS)集群中寻找节点CPU占用高的语句
    摘要:本文主要通过实例讲解如何通过gs_cpuwatcher.sh脚本寻找CPU占用高语句。本文分享自华为云社区《GaussDB(DWS)gs_cpuwatcher.sh脚本如何寻找CPU占用高语句》,作者:fighttingman。【工具名称】gs_cpuwatcher【功能描述】1.寻找集群内节点占用CPU高的语句【使用场景】CPUsys使用......