当前位置: 首页 > news >正文

网站模板怎样发布wordpress怎么添加邮箱

网站模板怎样发布,wordpress怎么添加邮箱,上海闵行区邮编,中国核工业华兴建设有限公司一、前言 正则作为一种常用的字符串处理方式#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}这四者之一的格式则 {}不作为次数的声明符号而是作为常规字符串进行识别。 但是上面第二个表达式在openGaussDB中会报错因为这里还有一个规则 如果 {}内的第一个字符是数字则开始进入次数的解析逻辑若解析不符合次数的规则就报错。 查看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:915breakpoint already hit 2 times 7 breakpoint keep y 0x0000000000fc42c4 in parsebranch(vars*, int, int, state*, state*, int) at regcomp.cpp:719breakpoint already hit 2 times 8 breakpoint keep y 0x0000000000fc5040 in parseqatom(vars*, int, int, state*, state*, subre*) at regcomp.cpp:965 9 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);} elseFAILW(REG_BADBR);break;case CHR(\\): /* BRE bound ends with \} */if (INCON(L_BBND) NEXT1(})) {v-now;INTOCON(L_BRE);RET(});} elseFAILW(REG_BADBR);break;default:FAILW(REG_BADBR); // {1*} 会在处理*的时候走到这里break;}有兴趣的可以自己下载源码去调试分析一下这里我就不详细解读源码了。 五、其他国产数据库对{}的处理 DM8和YASHAN和ORACLE保持一致能在 {}内不为次数时正确当成字符串而其他几款基于PG、OG的数据库以及纯自研的OCEANBASE在这种情况下都会报错mysql系不报错但执行返回空。 DM 8 SQL select regexp_substr(aaaa${1}bbb,(\${1*})) ;LINEID REGEXP_SUBSTR(aaaa${1}bbb,(\${1*})) ---------- --------------------------------------- 1 ${1}YASHAN 23 SQL select regexp_substr(aaaa${1}bbb,(\${1*})) from dual;REGEXP_SUBSTR(AAAA$ -------------------- ${1}KINGBASE 9 kingbase# select regexp_substr(aaaa${1}bbb,(\${1*})) ; kingbase-# / ERROR: invalid regular expression: invalid repetition count(s)HIGHGO 6 highgo# select regexp_substr(aaaa${1}bbb,(\${1*})) ; ERROR: invalid regular expression: invalidGAUSSDB 503 gaussdb# select regexp_substr(aaaa${1}bbb,(\${1*})) ; ERROR: invalid regular expression: invalid repetition count(s) CONTEXT: referenced column: regexp_substrOPENGAUSS 6.0 openGauss# select regexp_substr(aaaa${1}bbb,(\${1*})) ; ERROR: invalid regular expression: invalid repetition count(s) CONTEXT: referenced column: regexp_substrGBASE 8c postgres# select regexp_substr(aaaa${1}bbb,(\${1*})) ; ERROR: invalid regular expression: invalid repetition count(s) CONTEXT: referenced column: regexp_substrVASTBASE v2.2 build 16 postgres# 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的过程中经常能发现以往很多写得不标准的应用代码此时正是好机会将这些代码变得更加规范。 本文作者 DarkAthena本文链接 https://www.darkathena.top/archives/regexp-diff-with-repetition-count-between-opengauss-and-oracle版权声明 本博客所有文章除特别声明外均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处
http://www.hkea.cn/news/14275143/

相关文章:

  • iis怎么查看网站的域名网上简历模板
  • 仓库网站开发大气医院网站源码
  • 企业网站源码推荐wordpress 萌主题下载
  • 淄博想建网站wordpress 写博客
  • 帐号售卖网站建设关于企业网站建设的建议
  • 奎文建设局网站徐州建设工程交易网江苏本源
  • 咸阳免费做网站北京的公司有哪些
  • 免费开源网站系统电脑平面制图入门教程
  • 在那里做网站防爆玻璃门网站建设
  • 怎么提高网站百度权重网站 建设 培训 视频
  • 做网站时的注册权起到什么作用中国建筑网官网登录
  • 开发设计公司网站成都旅游季节最佳时间是几月份
  • 辽宁网站建站wordpress后台打开很慢
  • 做网站ps笔记本电脑北京网站的网站建设公司
  • 深圳网站建设工资交换链接或称互惠链接
  • 红河州网站建设制作如何制作假网页
  • 成都设计电商网站网站如何做竞价
  • 鄂州市门户网站公司百度网站怎么做
  • 网站建设属于软件开发烟台网站建设咨询
  • 国外不织布网站做的教具武威市凉州区建设局网站
  • 天津网站建设行业新闻企业网站开发费用会计分录
  • 甜点网站开发需求分析公司简历怎么写模板
  • 组建做网站的团队重庆城乡和住房建设信息网
  • 设计的网站源代码怎么做搜索引擎优化基本
  • 多个域名绑定同一网站吗wordpress数据库搜索功能
  • 梧州做网站建设游艇 高端网站建设
  • 哈尔滨营销型网站制作百度自动点击器下载
  • 烟台网站建设托管江西省城乡建设培训网站官方网站
  • 苍强广州网站建设公司大学生做静态网站
  • 威胁网站检测平台建设中标北京建设部网站