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,为客户预期结果。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
分布式场景下,如何对外提供易变的服务,打造可靠的注册中心?
摘要:本文讲了关于服务发现的很多干货内容,核心内容为服务发现组件的选择、网关的介绍、 客户端侧如何发给已发现的服务。 本文分享自华为云社区《分布式场景下,如何对外提供易变的服务,打造可靠的注册中心?》,作者:breakDawn。 随着云原生的概念越来越火,服务的架构应该如何发展和演进,成为很多程序员关心的话题。大名鼎鼎的《深入理解java虚拟机》一书作者于21年推出了新作《凤凰架构》,从这本书中可以看到当前时下很多最新的技术或者理念。 本博文将沉淀发布这本书的学习笔记和思考。 如果希望了解更加详细的内容,欢迎购买该书继续详细学习。 从类库到服务 1 服务发现 1.1 服务发现的意义 以前是DNS以及DNS之后的负载均衡承担了服务地址翻译的一部分能力,但是随着微服务的流向 服务的非正常掉线、重启、上下线越来越频繁。zk曾经活跃过,但是过于底层,需要用户自己做很多额外工作。因此专用于服务发现的 eureka出现并被纳入spring cloud。后来就是Consul和nacos继承了eureka的衣钵。 如何在基础设置和网络协议层面,对应用尽可能无感知、方便地实现服务发现是目前服务发现的一个...
- 下一篇
看华为云Serverless 4大特性如何让软件架构更丝滑
摘要:Serverless可以看作是一种云计算服务模型,它允许开发者在不需要管理服务器的情况下通过事件驱动的方式运行应用代码。 软件架构的发展从原先的单体架构到近十几年的微服务架构,再到现在新兴的Serverless架构。单体架构通常把应用的逻辑和功能耦合在一起,部署在BMS裸金属机或VM上,耦合模式使得一些通用功能或通用逻辑无法灵活复用,经常出现重复造轮子的现象,架构整体上是相对封闭的。 微服务时代对应用做了拆分,组件服务化,诞生了一系列优秀的设计原则,如接口标准化、CS/CD自动化,使得应用初步具备了弹性和自动容错的能力。 在Serverless的框架下,应用的粒度更细,例如以函数为粒度进行管理和开发迭代,应用通过事件驱动的方式触发运行。 Serverless可以看作是一种云计算服务模型,它允许开发者在不需要管理服务器的情况下通过事件驱动的方式运行应用代码,主要解决资源托管、调度、运维管理等一系列平台型问题,可以看作是DevOps的进一步延伸。 从传统微服务向Serverless演进的过程中,资源管理的边界逐步上移。在微服务时代,虚机/容器时代,开发者发布应用,需要管理虚拟化层或更...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19