我有一张约500k排的桌子;varchar(255)UTF8第filename列包含一个文件名;

我试图从文件名中go 掉各种奇怪的字符——我想使用字符类:[^a-zA-Z0-9()_ .\-]

现在,is there a function in MySQL that lets you replace through a regular expression?我正在寻找一个类似的函数来替换()函数-简化示例如下:

SELECT REPLACE('stackowerflow', 'ower', 'over');

Output: "stackoverflow"

/* does something like this exist? */
SELECT X_REG_REPLACE('Stackoverflow','/[A-Zf]/','-'); 

Output: "-tackover-low"

我知道大约REGEXP/RLIKE个,但是只有if个是匹配的,不是what个.

(我从一个PHP脚本中做了一个"SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\-]'",做了一个"preg_replace",然后做了一个"UPDATE foo ... WHERE pkey_id=...",但这看起来像是最后一次缓慢而丑陋的黑客攻击)

推荐答案

有了MySQL 8.0+,你可以使用本机的REGEXP_REPLACE功能.

12.5.2 Regular Expressions:

REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])

用替换字符串repl替换字符串expr中与模式pat指定的正则表达式匹配的匹配项,并返回结果字符串.如果exprpatreplNULL,则返回值为NULL.

Regular expression support:

之前,MySQL使用Henry Spencer正则表达式库来支持正则表达式运算符(REGEXPRLIKE).

正则表达式支持已经使用国际Unicode组件(ICU)重新实现,ICU提供了完整的Unicode支持,并且是多字节安全的.REGEXP_LIKE()函数以REGEXPRLIKE运算符的方式执行正则表达式匹配,这两个运算符现在是该函数的同义词.In addition, the REGEXP_INSTR(), REGEXP_REPLACE(), and REGEXP_SUBSTR() functions are available to find match positions and perform substring substitution and extraction, respectively.

SELECT REGEXP_REPLACE('Stackoverflow','[A-Zf]','-',1,0,'c'); 
-- Output:
-tackover-low

DBFiddle Demo

Mysql相关问答推荐

AWS RDS上的MySQL复制错误:超级权限或REPLICATION_SLAVE_ADMIN权限的访问被拒绝

根据当前表列的值,从SQL中的另一个表中获取数据

如果WHERE语句包含所有列,唯一键顺序是否重要?

如何跨多个产品查找相同时间范围的数据集

根据上一行S列结果计算列的查询

我是否需要在 N+1 列上建立索引,才能有效地在 N 列上执行 SELECT,并按其他列排序?

使用不同的 where 列进行子 Select

0000-00-00 00:00:00 表中的日期设置为 NOT NULL

从 mysql RDS 导出数据以导入 questDb

在分组结果 MySQL 5.7 版中获取最多的重复值

在 Presto Athena 中将字符串转换为数组

通过 Gorm 查询模型

为什么在有 BEGIN 和 END 时为存储过程指定分隔符?

SQL 中的双杠 (||) 是什么意思?

MySQL时区更改?

MySQL计算特定值的列

MySQL Workbench 无法加载 mysql.proc

MySQL - 表'my_table'没有被锁定表锁定

由于在 MySQL 中使用保留字作为表名或列名导致的语法错误

克隆 MySQL 数据库