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

这篇具有很好参考价值的文章主要介绍了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,为客户预期结果。

 

点击关注,第一时间了解华为云新鲜技术~文章来源地址https://www.toymoban.com/news/detail-434987.html

到了这里,关于GaussDB(DWS)字符串处理函数返回错误结果集排查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 字符串处理函数:sscanf 的用法

    前言: 一直对于一些日期字符串中数字的提取比较头疼,现看到 sscanf 对于字符串中的内容提取较方便,学习记录如下。方便以后查询。 sscanf() :将 C 语言字符串中数据按 指定的格式 将数据存储在对应的参数中。 成功则返回参数数目,失败则返回-1,错误原因存于errno中。

    2024年02月12日
    浏览(43)
  • C语言——字符串处理函数(6个)

    软件:Dev-C++ 参考书籍:C语言程序设计案例教程(第二版).张丽华.清华大学出版社 strlen 函数 —— 测试字符串长度 注意: 字符数组长度为括号内数字10,字符串长度为5 strcat 函数—— 字符串连接 注意 : 字符串2常连接到字符串1后,这就要求字符串1的空间足够大 strcpy 函数

    2024年02月06日
    浏览(36)
  • C#入门级——常见字符串处理方法/函数

    目录 1、去除字符串前后的空格 Trim() 2、按指定分隔符分割字符串,对字符串进行切片,并返回分割后的字符串数组 split()  3、字符串与数字之间的转换 Convert.ToString() Convert.ToInt16() 如果是被分割字符中出现两个连续的分割字符,那么字符串数组结果集会出现有空字符串成员的

    2023年04月09日
    浏览(49)
  • 【C语言】深入精讲字符串处理函数使用与优化

    目录 一、字符串处理函数 1、测量字符串的长度 strlen 2、字符串拷贝函数 strcpy/strncpy(拷贝前n个字符)  3、字符串追加函数strcat/strncat 4、字符串比较函数strcmp  5、字符查找函数strchr/strrchr  6、字符串查找strstr 7、字符串替换函数memset 8、字符串 切割 strtok  二、字符串转数值

    2024年02月17日
    浏览(49)
  • spark-sql处理json字符串的常用函数

    整理了spark-sql处理json字符串的几个函数: 1 get_json_object 解析不含数组的 json   2 from_json  解析json 3 schema_of_json 提供生成json格式的方法 4 explode   把JSONArray转为多行 get_json_object(string json_string, string path) :适合最外层为{}的json解析。  第一个参数是json对象变量,也就是含j

    2023年04月08日
    浏览(43)
  • 字符串解码:给一个字符串,返回解码后的字符串。

    字符串解码,给一个字符串s,返回解码后的字符串。字符串编码规则为k[str]表示括号内部str字符串正好重复k次,k保证为整数,并且输入的字符串肯定符合这种编码规则不会有额外的空格。 注意事项: 注意括号可能发生嵌套,例如输入字符串为 3[a2[c]] 应该返回accaccacc 1 = s

    2024年02月16日
    浏览(44)
  • unity 提取 字符串中 数字 修改后返回 字符串

    参考博主:unity 提取字符串数字修改后返回字符串_unity string提取数字_lvcoc的博客-CSDN博客  正数和浮点数的 正则表达式 示例: 用例:“z = 0.08596656649430752LAI  +  0.032354611497339036Aspect  +  0.07883658697039622Humidity  +  58.427987942231184” 打印结果:z = 0.085LAI  +  0.032Aspect  +  0.078H

    2024年02月11日
    浏览(53)
  • C语言:字符函数和字符串函数(一篇拿捏字符串函数!)

    目录 求字符串长度: 1. strlen(字符串长度) 长度不受限制函数: 2. strcpy(字符串拷贝) 3. strcat(字符串追加) 4. strcmp(字符串比较) 长度受限制函数: 5. strncpy(字符串拷贝) 6. strncat(字符串追加) 7. strncmp(字符串比较) 字符串查找: 8. strstr(查找字符串子串) 9. strtok(字符串分割) 错误信

    2024年02月10日
    浏览(105)
  • 基于postgresl的gaussDB(DWS)地址省市区解析函数

    地址格式为: 省(自治区,直辖市)、市、区。 直辖市的地址格式为, 北京市北京市海淀区xxxxx。 若是北京市海淀区xxx,自己改改就可以了 采用的是笨办法,穷举。 涉及的两个主要内置函数。 1. instr( start_position ,\\\'str1\\\' , \\\'str2\\\' , times) 。 查找str2在str1出现的位置。num是出现的次

    2024年02月15日
    浏览(36)
  • Delphi中返回由空格分隔的字符串中单词的总数

    有如下一个字符串: ‘苹果 香蕉 火龙果’ 是3个词语,返回3 如果\\\"苹果 香蕉\\\"用双引号就表示是一个整体算1个词语,返回2

    2023年04月19日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包