手机如何建立自己网站殡葬网站建设

张小明 2025/12/28 14:13:50
手机如何建立自己网站,殡葬网站建设,移动论坛网站模板免费下载,如何制作论坛网站一、前言正则作为一种常用的字符串处理方式#xff0c;在各种开发语言#xff0c;甚至数据库中#xff0c;都有自带的正则函数。但是正则函数有很多标准#xff0c;不同标准对正则表达式的解析方式不一样#xff0c;本次在迁移一个Oracle数据库到openGauss时发现了一个关于…一、前言正则作为一种常用的字符串处理方式在各种开发语言甚至数据库中都有自带的正则函数。但是正则函数有很多标准不同标准对正则表达式的解析方式不一样本次在迁移一个Oracle数据库到openGauss时发现了一个关于{}的差异点。二、{}是做什么用的在绝大部分的正则表达式规则中{}表示对前面字符的重复次数支持的形式为 {m}、{m,}、{,n}、{m,n}其中m和n均为自然数例如表达式说明b{1}匹配1次bb{2,}匹配2次到无穷次bb{,3}匹配0次到3次bb{2,3}匹配2次到3次b三、{}的使用歧义以下三条SQL均可以在Oracle中执行--匹配一个 $符号,此时 {}里的1表示 $的出现次数select regexp_substr(aaaa${1}bbb,(\${1})) from dual; --匹配${0个或任意个数的1}此时{}以及{}内的字符按照字符串识别select regexp_substr(aaaa${1}bbb,(\${1*})) from dual; --匹配 ${一个空格加上0个或任意个数的1} 此时{}以及{}内的字符按照字符串识别select regexp_substr(aaaa${ }bbb,(\${ 1*})) from dual;这里的规则在Oracle中大概可以这么描述{}内如果不满足 {m}、{m,}、{,n}、{m,n}这四者之一的格式则{}不作为次数的声明符号而是作为常规字符串进行识别。但是上面第二个表达式在openGauss中会报错因为这里还有一个规则如果{}内的第一个字符是数字则开始进入次数的解析逻辑若解析不符合次数的规则就报错。查看openGauss源码发现这段逻辑来自1998年的PG源码数十年来未曾变过。这里注意此处并非BUG只是正则标准不一致我使用了7种开发语言来验证发现JAVA和RUST中也同样是报错的而PHP/JS/PYTHON/.NET/GO 中都不报错。可以使用以下链接测试该正则表达式在不同开发语言中的表现https://regex101.com/r/APc3is/1四、相关源码使用openGauss分析这个逻辑的时候我断了几个点找了几段源码6 breakpoint keep y 0x0000000000fc4cd7 in parseqatom(vars*, int, int, state*, state*, subre*) at regcomp.cpp:915 breakpoint already hit 2 times7 breakpoint keep y 0x0000000000fc42c4 in parsebranch(vars*, int, int, state*, state*, int) at regcomp.cpp:719 breakpoint already hit 2 times8 breakpoint keep y 0x0000000000fc5040 in parseqatom(vars*, int, int, state*, state*, subre*) at regcomp.cpp:9659 breakpoint keep y 0x0000000000fc510c in parseqatom(vars*, int, int, state*, state*, subre*) at regcomp.cpp:984regc_lex.cpp, line 412.regcomp.cpp, line 966.当第一个字符是数字而第二个不是期望的字符0-9以及,“和”}就走到default报错case {: NEXT(); m scannum(v); //扫描数字static int scannum(struct vars* v){ int n 0; while (SEE(DIGIT) n DUPMAX) { n n * 10 v-nextvalue; NEXT(); } if (SEE(DIGIT) || n DUPMAX) { ERR(REG_BADBR); return 0; } return n;}case L_EBND: switch (c) { case CHR(0): case CHR(1): case CHR(2): case CHR(3): case CHR(4): case CHR(5): case CHR(6): case CHR(7): case CHR(8): case CHR(9): RETV(DIGIT, (chr)DIGITVAL(c)); // {1*} 会在处理1的时候走到这里 break; case CHR(,): RET(,); break; case CHR(}): /* ERE bound ends with } */ if (INCON(L_EBND)) { INTOCON(L_ERE); if ((v-cflags REG_ADVF) NEXT1(?)) { v-now; NOTE(REG_UNONPOSIX); RETV(}, 0); } RETV(}, 1); } else FAILW(REG_BADBR); break; case CHR(\\): /* BRE bound ends with \} */ if (INCON(L_BBND) NEXT1(})) { v-now; INTOCON(L_BRE); RET(}); } else FAILW(REG_BADBR); break; default: FAILW(REG_BADBR); // {1*} 会在处理*的时候走到这里 break; }有兴趣的可以自己下载源码去调试分析一下这里我就不详细解读源码了。五、其他国产数据库对{}的处理DM8和YashanDB和Oracle保持一致能在{}内不为次数时正确当成字符串而其他几款基于PostgreSQL、openGauss的数据库以及纯自研的OceanBase在这种情况下都会报错MySQL系不报错但执行返回空。DM 8SQL select regexp_substr(aaaa${1}bbb,(\${1*})) ;LINEID REGEXP_SUBSTR(aaaa${1}bbb,(\${1*}))---------- ---------------------------------------1 ${1}YashanDB 23SQL select regexp_substr(aaaa${1}bbb,(\${1*})) from dual;REGEXP_SUBSTR(AAAA$--------------------${1}KingbaseES 9kingbase# select regexp_substr(aaaa${1}bbb,(\${1*})) ;kingbase-# /ERROR: invalid regular expression: invalid repetition count(s)HighGO DB 6highgo# select regexp_substr(aaaa${1}bbb,(\${1*})) ;ERROR: invalid regular expression: invalidGaussDB 503gaussdb# select regexp_substr(aaaa${1}bbb,(\${1*})) ;ERROR: invalid regular expression: invalid repetition count(s)CONTEXT: referenced column: regexp_substropenGauss 6.0openGauss# select regexp_substr(aaaa${1}bbb,(\${1*})) ;ERROR: invalid regular expression: invalid repetition count(s)CONTEXT: referenced column: regexp_substrGBASE 8cpostgres# select regexp_substr(aaaa${1}bbb,(\${1*})) ;ERROR: invalid regular expression: invalid repetition count(s)CONTEXT: referenced column: regexp_substrVastbase v2.2 build 16postgres# select regexp_substr(aaaa${1}bbb,(\${1*})) ;ERROR: invalid regular expression: invalid repetition count(s)CONTEXT: referenced column: regexp_substrOceanBase 4.3执行以下 SQL 失败select regexp_substr(aaaa${1}bbb,(\${1*})) from dual失败原因ErrorCode 600, SQLState 42000, Details OBE-00600: internal error code, arguments: -5115, Got error U_REGEX_BAD_INTERVAL from regexp六、回到业务应用其实本文中这种歧义用法虽然在Oracle中不报错但是正确的编码方式应该是对于想要识别成字符的保留符号需要加上\进行转义即(\$\{1*\})。但结合实际业务规则来看加转义的方式虽然看上去结果是对的但逻辑其实是错的。该段业务程序是在做模板字符串处理系统中配置了多个字符串模板模板中使用${1} ${2}这样的标记作为填充值的占位符。如果使用占位符使用到了 ${11} 则(\$\{1*\})也能匹配上导致结果错误。所以准确的做法应该为(\$\{1\}),即不应该有这个*此时想替换第几个参数均能正确匹配。而为什么之前的业务代码中会有这个*我猜想大概是当时的开发人员写的(\${1})匹配不到想要的数据时发现加一个*就能匹配上就这么用下去了而该套系统多年以来从未有超过9个参数的模板因此该BUG一直未被人发现直到进行本次国产化改造才挖出来。七、总结有很多所谓的标准功能在不同的环境下有不同的标准这些标准各有各的准则经过多年的发展很难强求其一致性。就连正则表达式这样常用的功能都有不同的标准就不要指望ANSI SQL能让任意相同语句在每个数据库中执行结果完全一致了。在去O的过程中经常能发现以往很多写得不标准的应用代码此时正是好机会将这些代码变得更加规范。王勇昱云和恩墨高级技术顾问拥有十余年PL/SQL设计开发经验维护过数百套Oracle应用数据库。2021年起开始投入国产数据库建设多次获得墨天轮SQL挑战赛奖项及墨力之星获评CSDN领军人物参与过多个数据库相关开源项目的开发。数据驱动成就未来云和恩墨不负所托云和恩墨创立于2011年是业界领先的“智能的数据技术提供商”。公司以“数据驱动成就未来”为使命致力于将创新的数据技术产品和解决方案带给全球的企业和组织帮助客户构建安全、高效、敏捷且经济的数据环境持续增强客户在数据洞察和决策上的竞争优势实现数据驱动的业务创新和升级发展。自成立以来云和恩墨专注于数据技术领域根据不断变化的市场需求创新研发了系列软件产品涵盖数据库、数据库存储、数据库管理和数据智能等领域。这些产品已经在集团型、大中型、高成长型客户以及行业云场景中得到广泛应用证明了我们的技术和商业竞争力展现了公司在数据技术端到端解决方案方面的优势。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

瑞丽市建设局网站十款免费软件app下载

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个企业级视频采集系统,基于yt-dlp实现以下功能:1)多线程批量下载YouTube频道所有视频;2)自动提取视频元数据并存入数据库;3)视…

张小明 2025/12/25 0:21:08 网站建设

楚雄 公司 网站图片生成器软件免费版

一、为什么时间同步如此重要? 在分布式系统中,我们更需要的是“所有机器的时间一致性”,而不仅是单台机器的时间正确。 时间不同步可能导致的问题 1. 日志难以对齐 排查问题时,你会发现 A 服务 10:01 调用 B 服务,…

张小明 2025/12/25 0:21:26 网站建设

长沙专业网站设计重庆网站建设技术支持

职业资格考试备考助手——利用Anything-LLM整合教材与真题 在职业资格考试的战场上,时间就是竞争力。面对动辄上千页的教材、年复一年更新的政策法规和散落在各处的历年真题,许多考生陷入“学得慢、忘得快、查不到”的困境。传统的复习方式依赖人工翻书、…

张小明 2025/12/25 1:36:42 网站建设

南宁网站搜索引擎优化互联网网站模板

FaceFusion API 接口开放:便于集成至自有系统或SaaS平台在数字内容创作和智能交互日益普及的今天,用户对个性化视觉体验的需求正以前所未有的速度增长。从社交平台上的“换脸特效”到电商场景中的“虚拟试妆”,再到企业级应用中的人脸身份模拟…

张小明 2025/12/25 1:44:31 网站建设

石家庄网站制作软件wordpress仿站函数

AI驱动开发实战:BMAD-METHOD如何提升团队协作效率 【免费下载链接】BMAD-METHOD Breakthrough Method for Agile Ai Driven Development 项目地址: https://gitcode.com/gh_mirrors/bm/BMAD-METHOD 还在为开源项目中的沟通壁垒头疼吗?&#x1f91…

张小明 2025/12/25 2:18:38 网站建设