MySQL 쿼리를 사용하여 전체 테이블에서 텍스트 찾기 및 바꾸기


235

일반적으로 phpmyadmin을 사용하여 MySQL 데이터베이스의 텍스트를 바꾸려면 수동 찾기를 사용합니다. 나는 지금 피곤합니다 .phpmyadmin의 전체 테이블에서 텍스트를 찾아 새로운 텍스트로 바꾸는 쿼리를 어떻게 실행할 수 있습니까?

예 : 키워드 찾기 domain.com,로 교체하십시오 www.domain.com.



1
[this] [1]과 같은 것을 할 수 있습니다. [1] : stackoverflow.com/questions/562457/…
Pramod

2
이를 통해 필요한 것을 달성 할 수 있습니다.
Dom

답변:


551

A에 대한 single table갱신

 UPDATE `table_name`
 SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text')

부터 multiple tables-

모든 테이블에서 편집 할 경우, 가장 좋은 방법은 걸릴 것입니다 dump다음 find/replace다시 업로드합니다.


4
이것이 전체 필드를 대체합니까, 아니면 필드 내에서 하위 문자열 일치를 수행합니까?
랜디

3
@RandyGreencorn 필드 내의 하위 문자열을 대체합니다. 또한 대소 문자를 구분합니다.
앤드류

10
'domain.com'을 'www.domain.com'으로 바꾸고 'www.domain.com'을 'www.www.domain.com'으로
바꿉니다

2
이에 대한 추가 정보 : If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back.찾기 / 바꾸기를 위해 덤프에서 sed를 사용하십시오.sed "s:unwanted_text:wanted_text:g" dump.sql
kakoma

2
잘 작동합니다. 다른 사람들이 말했듯이 때로는 phpMyAdmin에서 작동하도록 인용 부호를 엉망으로 만들어야합니다. 전체 웹 주소가 포함 된 열에서 "http :"텍스트 만 "https :"로 바꾸는 데 사용했습니다. 나머지 웹 주소는 변경되지 않았습니다.
Heres2u

40

내가 찾은 가장 쉬운 방법은 데이터베이스를 텍스트 파일로 덤프하고 sed 명령을 실행하여 교체를 수행 한 다음 데이터베이스를 MySQL로 다시로드하는 것입니다.

아래의 모든 명령은 Linux에서 bash입니다.

데이터베이스를 텍스트 파일로 덤프

mysqldump -u user -p databasename > ./db.sql

sed 명령을 실행하여 대상 문자열 찾기 / 바꾸기

sed -i 's/oldString/newString/g' ./db.sql

데이터베이스를 MySQL로 다시로드

mysql -u user -p databasename < ./db.sql

쉬워요.


2
이것은 놀랍도록 빠르게 작동합니다. 나는이 솔루션을 좋아한다. 나는 URL 대체를해야하고 슬래시를 구분 기호로 사용하는 대신 파이프를 대신 사용했습니다 ( grymoire.com/Unix/Sed.html 참조 ). 예 : sed -i 's | olddomain.com | http : //newdomain.com | g './db.sql
Mike Kormendy

1
너무 빨라서 작동하지 않는다고 생각했습니다. 그러나 그것은했다! 또한 다음과 같이 슬래시를 피할 수 있습니다.\/\/domain.com
m.cichacz

2
OS X에서 sed -i명령이 unterminated substitute pattern오류를 발생 시킬 수 있음을 상기 시킵니다. sed -i '' -e 's/oldString/newString/g' ./db.sql대신 사용할 수 있습니다 .
afterglowlee

25

이것을 PHP 파일에 넣고 실행하면 원하는 작업을 수행해야합니다.

// Connect to your MySQL database.
$hostname = "localhost";
$username = "db_username";
$password = "db_password";
$database = "db_name";

mysql_connect($hostname, $username, $password);

// The find and replace strings.
$find = "find_this_text";
$replace = "replace_with_this_text";

$loop = mysql_query("
    SELECT
        concat('UPDATE ',table_schema,'.',table_name, ' SET ',column_name, '=replace(',column_name,', ''{$find}'', ''{$replace}'');') AS s
    FROM
        information_schema.columns
    WHERE
        table_schema = '{$database}'")
or die ('Cant loop through dbfields: ' . mysql_error());

while ($query = mysql_fetch_assoc($loop))
{
        mysql_query($query['s']);
}

나를 위해 일하지 않았다, 좋은 제안-달콤했을 것이다
AlexHighHigh

23

mysite.com/wordpress 찾기 및 mysite.com/news로 바꾸기와 같은 모든 wordpress 블로그 게시물에서 텍스트를 찾아서 바꾸기 위해 PHPmyadmin에서 SQL 쿼리를 실행합니다.이 예제에서 tj_posts

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')

2
질문 해 주셔서 감사합니다. 내 WordPress 사이트의 경우 열 이름은 wp_posts쿼리처럼 보입니다UPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris B.

10

다른 옵션은 데이터베이스의 각 열에 대한 명령문을 생성하는 것입니다.

SELECT CONCAT(
    'update ', table_name , 
    ' set ', column_name, ' = replace(', column_name,', ''www.oldDomain.com'', ''www.newDomain.com'');'
) AS statement
FROM information_schema.columns
WHERE table_schema = 'mySchema' AND table_name LIKE 'yourPrefix_%';

그러면 실행할 수있는 업데이트 문 목록이 생성됩니다.


2
덤핑보다 느리지 만 명령 행에 익숙하지 않은 사람들에게는이 답변이 창의적이고 효과적입니다.
Stephane

3
데이터가 많고 덤프 / 재로드 할 수없는 경우이 방법이 가장 좋습니다.
Kariem

아 이거 잘 됐어! 이 아이디어를 바탕으로 스크립트를 공유하겠습니다
Andy

이것은 과소 평가 된 솔루션입니다. 완전히 나를 위해 일했습니다.
rw-intechra

8
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

예를 들어, John의 모든 발생을 Mark로 바꾸려면 아래에서 사용합니다.

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');

3

phpMyAdmin에는 깔끔한 찾기 및 바꾸기 도구가 포함되어 있습니다.

테이블을 선택한 다음 검색 > 찾기 및 바꾸기 를 누르 십시오.

이 쿼리는 분 걸렸다 성공적으로 수천 개의 인스턴스를 대체 oldurl.extnewurl.ext열 내post_content

phpMyAdmin에서 찾기 및 바꾸기 기능의 스크린 샷

이 방법의 가장 좋은 점 : 커밋하기 전에 모든 경기를 확인하십시오.

NB phpMyAdmin 4.9.0.1을 사용하고 있습니다


2

"swapnesh"답변이 최고라고 생각합니다! 불행히도 나는 phpMyAdmin (4.5.0.2)에서 그것을 실행할 수 없었습니다.

따라서 동일한 문제가 발생하고 PMA 이외의 다른 데이터베이스에 액세스 할 수없는 경우 다음과 같은 솔루션이 유용했습니다 ...

UPDATE `wp_posts` AS `toUpdate`,
(SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid` 
 FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated`
SET `toUpdate`.`guid`=`updated`.`guid`
WHERE `toUpdate`.`ID`=`updated`.`ID`;

예상되는 결과를 테스트하려면 다음을 사용하십시오.

SELECT `toUpdate`.`guid` AS `old guid`,`updated`.`guid` AS `new guid`
FROM `wp_posts` AS `toUpdate`,
(SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid`
 FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated`
WHERE `toUpdate`.`ID`=`updated`.`ID`;

2

업데이트 할 필드가 직렬화되지 않았다고 확신하면 위의 솔루션이 제대로 작동합니다.

그러나 업데이트해야하는 필드에 직렬화 된 데이터가 포함되어 있으면 SQL 쿼리 또는 덤프 파일에서 간단한 검색 / 바꾸기가 직렬화를 중단합니다 (교체 된 문자열이 검색된 문자열과 정확히 동일한 문자 수를 갖지 않는 한).

"직렬화 된"필드는 다음과 같습니다.

a:1:{s:13:"administrator";b:1;}  

관련 데이터의 문자 수는 데이터의 일부로 인코딩됩니다.
직렬화는 "개체"를 데이터베이스에 쉽게 저장되는 형식으로 변환하거나 다른 언어간에 개체 데이터를 쉽게 전송하는 방법입니다.
다음은 객체 데이터를 직렬화 하는 데 사용되는 여러 가지 방법에 대한 설명 과 그 이유는 무엇이며, WordPress 중심의 게시물은 직렬화 된 데이터, 그 의미는 무엇이며 왜 그렇게 중요합니까? 일반 언어로.

MySQL에 직렬화 된 데이터를 자동으로 처리하는 도구가 내장되어 있으면 놀랍지 만 그렇지 않습니다. 직렬화 형식이 다르기 때문에 그렇게하는 것도 의미가 없습니다.

wp-cli
위의 답변 중 일부는 WordPress 데이터베이스에만 해당되는 것으로 보였으며 많은 데이터를 직렬화합니다. 워드 프레스는 명령 행 도구를 제공, 검색-교체 WP 즉, 수행 핸들 직렬화.
기본 명령은 다음과 같습니다.

    wp search-replace 'an-old-string' 'a-new-string' --dry-run

그러나 WordPress에서는 guid변경해서는 안된다는 점을 강조 하므로 해당 열을 건너 뛰는 것이 좋습니다.
또한 종종 wp_users테이블 을 건너 뛰고 싶을 때가 있습니다 .
그 모습은 다음과 같습니다.

wp search-replace 'https://old-domain.com' 'https://shiney-new-domain.com' --skip-columns=guid --skip-tables=wp_users --dry-run

참고 : --dry-run플래그를 추가하여 복사하여 붙여 넣기가 자동으로 다른 사람의 데이터베이스를 망칠 수는 없습니다. 스크립트가 원하는 작업을 수행 한 후 해당 플래그없이 다시 실행하십시오.

플러그인
WordPress를 사용하는 경우 GUI 인터페이스를 제공하는 많은 무료 및 상용 플러그인이 많이 있으며 추가 기능이 많이 포함되어 있습니다.

Interconnect / it PHP 스크립트
Interconnect / it는 직렬화 된 데이터를 처리 할 수있는 PHP 스크립트 ( 안전 검색 및 바꾸기 도구)를 제공합니다. WordPress 사이트에서 사용하기 위해 만들어졌지만 PHP로 직렬화 된 모든 데이터베이스에서 사용할 수있는 것처럼 보입니다.
WordPress 자체를 포함한 많은 회사에서이 도구를 권장합니다. 여기에 지침 은 페이지 아래 약 3/4입니다.


1

SQL 파일로 내보내고 Visual Studio 코드와 같은 편집기로 파일을 열고 단어를 찾아서 다시 배치하는 것이 가장 좋습니다. 나는 총 1,4600 단어 16 단어에 1 분에 1 공연 파일 SQL에서 바꿉니다. 최선의 방법. 교체 후 저장하고 다시 가져옵니다. 가져 오기 위해 zip으로 압축하는 것을 잊지 마십시오.


0

FAST (변경 SQL 쿼리) 생성

mysql -e "SELECT CONCAT ( 'update', table_name, 'set', column_name, '= replace (', column_name, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') AS_FROM information_schema.columns WHERE table_name LIKE'wp_ % ' "-u root -p your_db_name_here> upgrade_script.sql

파일 시작시 모든 쓰레기를 제거하십시오. 나는 몇 가지를했다.

nano upgrade_script.sql

--force 옵션으로 생성 된 스크립트를 실행하여 오류를 건너 뜁니다. (느리게-큰 DB라면 커피를 움켜 쥐십시오)

mysql -u root -p your_db_name_here --force <upgrade_script.sql


0

대문자-소문자가있는 문장의 경우 BINARY REPACE를 사용할 수 있습니다

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.