我有很多表,正在进行一些时髦的字符替换。我找到了一些关于运行更新来替换这些信息的信息,但它存在于许多表和许多字段中。
update <table_name>
set <field> = replace(<field>,'’','\'');
update <table_name>
set <field>= replace(<field>,'…','...');
update <table_name>
set <field>= replace(<field>,'–','-');
update <table_name>
set <field>= replace(<field>,'“','"');
update <table_name>
set <field>= replace(<field>,'â€','"');
update <table_name>
set <field>= replace(<field>,'‘','\'');
update <table_name>
set <field>= replace(<field>,'•','-');
update <table_name>
set <field>= replace(<field>,'‡','c');
Run Code Online (Sandbox Code Playgroud)
对于在所有表的每个字段中运行此操作,你们有什么建议吗?我想过做一个 mysql 转储并使用 sed 来替换所有内容,但我不确定如何构建命令,因为它们都是特殊字符。
任何帮助将不胜感激。
您可以尝试查询表information_schema.columns并查找 MySQL 数据库实例中具有字符字段的每个表。这是表格的布局:
mysql> show create table information_schema.columns\G
*************************** 1. row ***************************
Table: COLUMNS
Create Table: CREATE TEMPORARY TABLE `COLUMNS` (
`TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '',
`TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
`TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
`COLUMN_NAME` varchar(64) NOT NULL DEFAULT '',
`ORDINAL_POSITION` bigint(21) unsigned NOT NULL DEFAULT '0',
`COLUMN_DEFAULT` longtext,
`IS_NULLABLE` varchar(3) NOT NULL DEFAULT '',
`DATA_TYPE` varchar(64) NOT NULL DEFAULT '',
`CHARACTER_MAXIMUM_LENGTH` bigint(21) unsigned DEFAULT NULL,
`CHARACTER_OCTET_LENGTH` bigint(21) unsigned DEFAULT NULL,
`NUMERIC_PRECISION` bigint(21) unsigned DEFAULT NULL,
`NUMERIC_SCALE` bigint(21) unsigned DEFAULT NULL,
`CHARACTER_SET_NAME` varchar(32) DEFAULT NULL,
`COLLATION_NAME` varchar(32) DEFAULT NULL,
`COLUMN_TYPE` longtext NOT NULL,
`COLUMN_KEY` varchar(3) NOT NULL DEFAULT '',
`EXTRA` varchar(27) NOT NULL DEFAULT '',
`PRIVILEGES` varchar(80) NOT NULL DEFAULT '',
`COLUMN_COMMENT` varchar(1024) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)
以下是获取所有用户定义表的每个基于字符的列类型的查询:
mysql> select DISTINCT COLUMN_TYPE from information_schema.columns
-> WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
-> AND (COLUMN_TYPE REGEXP 'text$'
-> OR COLUMN_TYPE REGEXP '^varchar'
-> OR COLUMN_TYPE REGEXP '^char');
+--------------+
| COLUMN_TYPE |
+--------------+
| mediumtext |
| varchar(512) |
| varchar(20) |
| longtext |
| text |
| varchar(200) |
| varchar(255) |
| varchar(100) |
| tinytext |
| varchar(25) |
| varchar(64) |
| varchar(32) |
| varchar(60) |
| varchar(50) |
| varchar(250) |
| varchar(150) |
| varchar(10) |
| varchar(45) |
| char(5) |
+--------------+
19 rows in set (0.09 sec)
Run Code Online (Sandbox Code Playgroud)
您可以将该查询加入到第二个查询中。第二个查询将包含具有这些列类型的每个表的名称:
SELECT BB.table_schema,BB.table_name,BB.COLUMN_NAME FROM
(select DISTINCT COLUMN_TYPE from information_schema.columns
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND (COLUMN_TYPE REGEXP 'text$'
OR COLUMN_TYPE REGEXP '^varchar'
OR COLUMN_TYPE REGEXP '^char')) AA
INNER JOIN
(SELECT table_schema,table_name,COLUMN_NAME,COLUMN_TYPE
FROM information_schema.columns
WHERE table_schema NOT IN
('mysql','information_schema','performance_schema')) BB
USING (COLUMN_TYPE);
Run Code Online (Sandbox Code Playgroud)
现在,向输出发送消息,使其为您编写通用脚本:
SELECT CONCAT('UPDATE ',db,'.',tb,' SET ',fld,
'=REPLACE(',fld,',''oldchar'',''newchar'');')
UpdateCommand
FROM (SELECT db,tb,fld FROM
(
SELECT table_schema db,table_name tb,COLUMN_NAME fld FROM
(select DISTINCT COLUMN_TYPE from information_schema.columns
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND (COLUMN_TYPE REGEXP 'text$'
OR COLUMN_TYPE REGEXP '^varchar'
OR COLUMN_TYPE REGEXP '^char')) AAA
INNER JOIN
(SELECT table_schema,table_name,COLUMN_NAME,COLUMN_TYPE
FROM information_schema.columns
WHERE table_schema NOT IN
('mysql','information_schema','performance_schema')) BBB
USING (COLUMN_TYPE)
) AA) A;
Run Code Online (Sandbox Code Playgroud)
输出应如下所示:
+-----------------------------------------------------------------------------------------------+
| UpdateCommand |
+-----------------------------------------------------------------------------------------------+
| UPDATE example.user SET user_name=REPLACE(user_name,'oldchar','newchar'); |
| UPDATE garbage.rolando SET post_content=REPLACE(post_content,'oldchar','newchar'); |
| UPDATE garbage.rolando SET post_title=REPLACE(post_title,'oldchar','newchar'); |
| UPDATE garbage.rolando SET post_excerpt=REPLACE(post_excerpt,'oldchar','newchar'); |
| UPDATE garbage.rolando SET post_status=REPLACE(post_status,'oldchar','newchar'); |
| UPDATE garbage.rolando SET comment_status=REPLACE(comment_status,'oldchar','newchar'); |
| UPDATE garbage.rolando SET ping_status=REPLACE(ping_status,'oldchar','newchar'); |
| UPDATE garbage.rolando SET post_password=REPLACE(post_password,'oldchar','newchar'); |
| UPDATE garbage.rolando SET post_name=REPLACE(post_name,'oldchar','newchar'); |
Run Code Online (Sandbox Code Playgroud)
通用脚本生成的最后一步是将查询输出到文本文件,如下所示:
mysql -u... -p... -A --skip-column-names -e"SELECT CONCAT('UPDATE ',db,'.',tb,' SET ',fld, '=REPLACE(',fld,',''oldchar'',''newchar'');') UpdateCommand FROM (SELECT db,tb,fld FROM ( SELECT table_schema db,table_name tb,COLUMN_NAME fld FROM (select DISTINCT COLUMN_TYPE from information_schema.columns WHERE table_schema NOT IN ('mysql','information_schema','performance_schema') AND (COLUMN_TYPE REGEXP 'text$' OR COLUMN_TYPE REGEXP '^varchar' OR COLUMN_TYPE REGEXP '^char')) AAA INNER JOIN (SELECT table_schema,table_name,COLUMN_NAME,COLUMN_TYPE FROM information_schema.columns WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')) BBB USING (COLUMN_TYPE) ) AA) A;" > CharUpdateScript.sql
Run Code Online (Sandbox Code Playgroud)
您可以从那里自定义通用脚本。
归档时间: |
|
查看次数: |
576 次 |
最近记录: |