我继承了一个包含大约6,000个条目的数据库。其中一列表示一组6项作为varchar。一些条目看起来像这样:
A
ABC
A,B,C,D,E,F
ade
ONONONONONONON
onon?" or sleep(10)#onononon
它看起来很垃圾,但我想我想要挽救那些用字母表示的东西,但忽略看起来像注射攻击的结果。
我想要做的是将此列表示为SET类型。我正在考虑(伪代码):
UPDATE MYTABLE
SET NEWCOLUMN = (NEWCOLUMN & 'A')
WHERE (REGEX MATCHES OLDCOLUMN)
对6个不同的元素重复此查询6次。
我无法弄明白我的下一步...我似乎无法弄清楚如何编写此更新查询以便它起作用 - 首先,我似乎无法弄清楚如何为mysql写一个正则表达式。
答案 0 :(得分:1)
老实说,最好的办法是通过PHP,Perl,Python等脚本语言来运行它,然后将这些值分解为新的记录。单个SQL查询将无法完成任务。
答案 1 :(得分:0)
虽然此解决方案不涉及sql,但您可能会发现它很有用。尝试使用Google Refine,它是一个免费的工具,用于清理异类数据集,它有一个很好的gui,允许你使用正则表达式等。
答案 2 :(得分:0)
我只是快速测试了这个,但ALTER TABLE
怎么样ALTER TABLE mytable MODIFY mycolumn SET('AAA', 'BBB', 'CCC', 'A', 'C');
我先在副本上执行此操作,并确保没有警告,否则您将丢失数据。