这需要数据库在线吗?面对这个问题,我会考虑将数据转储到文件中,然后使用perl、awk或其他适合以这种方式处理文本的工具进行处理。
如果不可能的话,另一个选择是在一个函数内构建混合算法,该函数接收VARCHAR,并返回清理后的字符串作为VARCHAR(注意:未经测试的代码,仅用于说明):
CREATE FUNCTION cleanup(instr VARCHAR(255)) RETURNS VARCHAR(255));
DECLARE outstr VARCHAR(255);
SET outstr = TRIM(instr);
IF NOT (outstr REGEXP '^[[:alnum:][.left-parenthesis.]]');
SET outstr = SUBSTRING(outstr,2);
END IF;
WHILE NOT (outstr REGEXP '[[:alnum:][.right-parenthesis.]]$' DO
SET outstr = LEFT(outstr, LENGTH(outstr)-1);
END WHILE;
SELECT outstr;
END FUNCTION;
然后,您可以编写一个查询,读取系统目录,即information_schema.columns
并生成所需的UPDATE语句。 大致如下(未经测试):
SELECT CONCAT_WS(" ", "UPDATE", table_name,
"SET", column_name, " = cleanup(", column_name, ")")
FROM information_schema.columns
WHERE table_schema = "your-database" AND collation_name IS NOT NULL
保存输出,检查并运行。
collation_name
过滤器应确保我们仅限于文本类型字段。同样,这未经测试,但应该给您一个大致的想法。您甚至可以使用 GROUP_CONCAT
来构建一个版本,它会为每个表创建一个单独的 SQL 语句,而不是每个列,但那有点花哨。
显然,在运行任何执行如此广泛的更新的操作之前,您应该备份数据库...