Должна ли база данных быть в сети для этого? Столкнувшись с этой проблемой, я подумал бы о том, чтобы выгружать данные в файлы для обработки с помощью perl, awk или другого инструмента, подходящего для обработки текста таким способом.
Если это невозможно, другой альтернативой является построение алгоритма обработки внутри FUNCTION , который получает VARCHAR и возвращает очищенную строку в виде VARCHAR (NB-непроверенный код, только пояснительный):
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-оператор для таблицы, а не для столбца, но это немного причудливо.
Очевидно, что вы бы сделали резервную копию базы данных, прежде чем запускать что-либо, что собиралось выполнить такие широкомасштабные обновления ...