MySQL正则替换:如何用REGEXP_REPLACE()删除“@&”及其后的内容?

嘿嘿,MySQL的标准替换功能其实还是蛮实用的。
我以前遇到过很多陷阱。

我记得那是2 01 8 年,我在一家公司负责维护用户反馈系统。
数据量很大,可能有数百万条。
当时系统后台经常收到恶意用户留下的垃圾邮件,其中包含特别烦人的以“@&”开头的链接。

我使用正则表达式“@&”,然后使用 REGEXP_REPLACE() 函数来替换这些链接。
这个功能很强大,但是做起来有点复杂。
您必须先编写正则表达式,然后调用该函数。
您还应该注意MySQL的版本。
当时我使用的MySQL版本比较低,必须自己写存储过程。

有一次,我写了一条更新语句来一次处理所有评论,但不小心 WHEREyour_columnREGEXP&3 9 ;@&3 9 ;;。
当时我并不知道这种写法相当于空字符串。
结果没有更新数据,忙了好久。

后来我尝试了另一种方法,先查询再更新,不影响数据。
特殊操作是:

更新您的表格 设置 yourColumn = REGEXP_REPLACE(yourColumn, '@&.', ''); 其中 your_column REGEXP 是 '@&';
这种方法效果很好,但是过程很慢。
因为数据量太大,一次只能处理几千条数据,而且必须分组进行,非常费力。

还有一次,我遇到了更复杂的情况,就是保留“@&”后面的某些字符,例如只删除第一个空格。
这就需要将正则表达式修改为“@&[^]”。
此表达式匹配“@&”后的非空格字符。

但是这个东西要小心使用。
如果正则表达式写错了,可能会导致意想不到的结果,比如删除了不该删除的内容。
因此,在实际操作之前,在上战场之前,最好先在测试区域进行检查,确保无误。

总之,这个REGEXP_REPLACE()函数非常有用,但是使用时要小心,以免陷入陷阱。

mysql命令界面如何换行

说实话,我在MySQL命令行做换行的时候也遇到过很多坑。
您提出的所有观点都适用。
我将根据我自己的研究添加一些细节。

例如,在使用 INSERT 写入多行数据时,使用反斜杠继续行特别有用。
上次我们设计了一个客户端批量插入数百条记录的脚本。
如果全部写在一行里,分号太多了,眼睛会晕。
像这样分解它:
sql 插入订单(ID、产品、数量) 价值观 (1 , '笔记本电脑', 2 ), (2 ,“鼠标”,5 ), (3 ,“键盘”,1 0), (4 , '监控', 1 );
重要的是要记住,反斜杠后面必须跟换行符并且不能有空格。
作为初学者,当我写 \select... 时我笑了,系统立即抱怨语法错误。
然而,这种方法有局限性。
也就是说,行延续之后的语句不会自动获取前一行的上下文。
例如,如果继续执行 UPDATE 语句,则必须记住指定 WHERE 条件。

分号简单又容易。
通常,在创建简单查询(例如 SHOW DATABASES;)时不使用反斜杠。
您可能会编写带有注释的语句,例如 SELECT FROM table WHERE id = 1 ; -
这是一条评论。
可以在分号之前添加注释,然后添加新行。
但是,如果您在分号之后立即换行,系统会将下一行读取为新语句。
这需要特别注意。

最麻烦的问题是通行证逃逸问题。
部署到Windows环境之前,mytable在使用LOAD DATA INFILE 'C:\data\file.txt' INTO TABLE时直接报错。
然后更改为 LOAD DATA INFILE 'C:\\data\\file.txt' INTO TABLE mytable。
说实话,当时我不明白为什么双反斜杠就足够了。
后来查资料发现MySQL使用单个反斜杠作为转义字符。

使用C键取消输入。
例如,如果你写了一个很长的查询语句,突然意识到忘记添加某个字段,并且不想删除或重写它,只需按两次 Enter 键,就会出现 -> 提示符。
如果此时键入 C,系统会清除当前行并允许您重新开始。
这比Ctrl+C方便得多。

概述中描述的错误处理非常实用。
我有一个习惯。
如果您不确定创建后是否立即执行该语句,请在分号后面添加注释。
-
先不要运行它。
这不会触发执行或导致光标跳转到下一行。
当在团队中工作时,这个细节特别有用,可以避免错误。

但最终,一旦您使用这些技术,它们就会成为您的第二天性。
当我教新人时,我总是要求他们先习惯分号,然后学习反斜杠。
毕竟,9 0% 的情况下,分号就足够了。
我个人没有在NoSQL环境中运行过这个,所以我不知道它与其他数据库中的换行符有何不同。

MySQL-数据换行符问题

嘿,这种事以前发生在我身上。
大概去年,我们的系统连接了遗留数据库数据并使用 concat 函数来连接字段。
结果在很多地方显示为“na”。
一开始我以为数据有问题,但是再查找之后,发现问题出在换行上。

我记得在旧的Windows系统数据上,换行符是“\r\n”。
如果直接在phpMyAdmin中查看,根本看不到换行符。
您必须使用命令行客户端并设置选项才能查看它。
例如:--protocol=TCP 连接,则 SET SESSION sql_mode='ANSI_QUOTES';这样设置可以清楚地显示隐藏的字符。

然后我使用 REPLACE 函数来完成此操作。
我把具体代码复制给你:
sql 更新表名 SET 列名 = REPLACE(列名, '\r\n', '') 列名 WHERE LIKE '%\r\n%'
请记住将表名和列名替换为您自己的名称。
该语句将用空字符串替换所有列名称中的“\r\n”。
完成此操作后,再次检查,“na”位置将正常显示。

但是要注意,如果数据量特别大,比如几十万条数据,这个REPLACE操作可能会比较慢。
我记得我处理了大约5 万条数据,等了差不多十分钟才完成。
所以如果数据量很小的话也是可以的。
如果数量较大,您可能需要先进行批量处理,或者下次再运行。

另一种情况是,如果数据中充满了换行符,则替换后整个字段将变成空字符串。
您还应该注意这种情况。
那一次我遇到了一些空字段,然后添加了一个猜测。
如果替换后该字段为空,则将分配默认值。

总之,换行很烦人,但是REPLACE函数还是蛮有用的。
重要的是要小心并检查几次。