gpt4 book ai didi

mysql - “括号不平衡”正则表达式错误继续发生-我无法确定失败的方式

转载 作者:行者123 更新时间:2023-11-29 05:19:24 37 4
gpt4 key购买 nike

最初,我认为这个问题是我理解上的一个普遍失误,或者可以概括为一个对其他人有用的案例。我仍然没有解决这个问题,但是当我进一步了解这个问题的边界时,我发现它可能是非常具体的东西,对社区没有用处。谢谢你的帮助和所花的时间。
摘要
当我将值(Unit-101|00-102|Unit_103|Unit 104)传递给我的存储过程(作为VARCHARRLIKE子句中用作WHERE中的比较)时,它将生成错误'parentheses not balanced'。但是,当捕获组中的其他值传入时(例如(Unit-101|00-102|Unit_103))-3或更少,通配符(.*)或通配符组件(Unit-1.*)值工作正常时,存储过程工作正常。另外,当捕获组中有三个以上的值时,非常相似的存储过程可以完美地工作。。。(详情请参见下文。谢谢你。)
编辑:至少我是这么想的。我尝试了(a|b|c|d)(我曾经尝试过其他不起作用的值)-而且成功了。所以我再一次完全不知所措。
问题上下文
我有一个存储过程,它在WHERE子句中包含一些正则表达式-它仅在Unit名称与传递给过程(_r_unit,anINVARCHAR(100))的正则表达式匹配时为条目聚合一些总计。
这对于_r_unit-.*Unit-B.*Unit-101等许多情况都是可以预期的-但是在一个情况下,当我使用括号捕获Unit-101、00-102、Unit-103或Unit 104-(Unit-101|00-102|Unit_103|Unit 104)时,查询失败,并出现错误#1139 - Got error 'parentheses not balanced' from regexp
迄今为止试图找到解决方案的步骤
我第一次发现这个问题是在从php传入regexp值时,使用preg_quote来转义单元名中的-字符。然而,一位评论者指出,-字符不需要在这里转义,php意味着它无论如何都需要“双转义”。所以,我尝试了一些与php相关的事情,但这似乎不是问题所在——现在我已经消除了这一点,因为我只是使用phpmyadmin手动传递值来检查导致错误的条件。作为参考,从php作为值传递给存储过程的变量被设置为-
"(" . preg_quote("Unit-101") . "|" . preg_quote("00-102") . "|"
. preg_quote("Unit_103") . "|" . preg_quote("Unit 104") . ")";

正如预期的那样,变量的文本内容(通过回显它来检查)是(Unit\-101|00\-102|Unit_103|Unit 104)
我还检查了regex101中的regex,以检查它是否“按照它在tin上所说的做”——正如预期的那样,查找Unit-10100-102Unit_103Unit 104
我试过的regex输入的变体。
不生成错误的正则表达式
CALL StoredProcedure('(Unit-101)'); // Or any other of the four units, non-escaped dash
CALL StoredProcedure('(Unit\-101)'); // Or any other of the four units, escaped dash
CALL StoredProcedure('(Unit-101|00-102)')
CALL StoredProcedure('(Unit_103|Unit 104)')
CALL StoredProcedure('(Unit-101|Unit_103|Unit 104)')
CALL StoredProcedure('(00-102|Unit_103|Unit 104)')
CALL StoredProcedure('(Unit-101|00-102|Unit 104)')
生成错误的正则表达式
CALL StoredProcedure('(Unit-101|00-102|Unit_103|Unit 104)')
CALL StoredProcedure('(Unit 104|00-102|Unit-101|Unit_103)')
CALL StoredProcedure('(Unit-101|00-102)|(Unit_103|Unit 104)')
我也尝试了一些随机值-它似乎打破了4个值,不管它们是什么。
我刚刚尝试运行另一个接受相同值(即_r_unit)的存储过程,它可以正确地处理4个值。它们是非常相似的查询,所以我试图在使用regex的WHERE子句中找到差异,但找不到任何。。。
存储过程1 WHERE子句-生成错误

/* first WHERE clause, to retrieve results FROM one database */ 

WHERE
`Date` BETWEEN _startDate AND _endDate
AND `Unit Type` = _unitType
AND `Unit Serial` RLIKE _r_unit
AND `Driver` RLIKE _r_driver
AND `Error` != ""
AND `Error` RLIKE _r_errorCode

/* second WHERE clause, to retrieve results FROM a second (relational) database */
/* (there are two WHERE clauses because the results are unioned together) */

WHERE
DB._Records.Date BETWEEN _startDate AND _endDate
AND DB.UnitTypes.Module = _unitType
AND DB.Units.Serial RLIKE _r_unit
AND DB.Drivers.Driver RLIKE _r_driver
AND DB.ErrorCodes.ErrorCode != ""
AND DB.ErrorCodes.ErrorCode RLIKE _r_maintCode

存储过程2 WHERE子句-不生成错误
/* first WHERE clause, to retrieve results FROM one database */ 

WHERE
`Date` BETWEEN _startDate AND _endDate
AND `Unit Type` = _unitType
AND `Unit Serial` RLIKE _r_unit
AND `Driver` RLIKE _r_driver

/* second WHERE clause, to retrieve results FROM a second (relational) database */
/* (there are two WHERE clauses because the results are unioned together) */

WHERE
DB._Records.Date BETWEEN _startDate AND _endDate
AND DB.UnitTypes.Module = _unitType
AND DB.Units.Serial RLIKE _r_unit
AND DB.Drivers.Driver RLIKE _r_driver

(我知道有些字段的名称不正确,但这是一个旧系统,很多东西都依赖它,因此很难更改)
我已经没有办法了!任何建议都非常感谢!

最佳答案

这个答案并没有解决问题中暴露的问题,但太长,不适合发表评论。
MySQL的一个小引用:
因为MySQL在字符串中使用C转义语法(例如,“\n”表示换行符),所以必须将REGEXP字符串中使用的任何“\”加倍。
...
若要在正则表达式中使用特殊字符的文本实例,请在其前面加上两个反斜杠(\)字符。MySQL解析器解释其中一个反斜杠,而正则表达式库解释另一个。
这意味着反斜杠(\)被MySQL吞入,正则表达式引擎看不到它们。但是,在公开的regex中,破折号(-)没有特殊含义,可以不加引号。
不幸的是,这并不能解释为什么查询失败,并出现奇怪的错误消息。

关于mysql - “括号不平衡”正则表达式错误继续发生-我无法确定失败的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27903979/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com