programing

전체 MySQL 데이터베이스 찾기 및 바꾸기

randomtip 2022. 10. 22. 09:45
반응형

전체 MySQL 데이터베이스 찾기 및 바꾸기

테이블뿐만 아니라 전체 데이터베이스 내에서 검색 및 치환을 하고 싶습니다.

아래 스크립트를 작동하도록 변경하려면 어떻게 해야 합니까?

 update [table_name] set [field_name] = replace([field_name],'[string_to_find]','[string_to_replace]');

아스타리스크만 쓰면 되나요?

 update * set [field_name] = replace([field_name],'[string_to_find]','[string_to_replace]');

sqldump를 텍스트 파일로 변환하고 sqldump를 검색/바꾸고 다시 가져옵니다.

데이터베이스를 텍스트 파일로 덤프합니다.
mysqldump -u root -p[root_password] [database_name] > dumpfilename.sql

데이터베이스를 변경한 후 복원하십시오.
mysql -u root -p[root_password] [database_name] < dumpfilename.sql

WordPress MySQL 쿼리에서 이전 URL을 새 URL로 업데이트:

UPDATE wp_options SET option_value = replace(option_value, 'http://olddomain.example', 'http://newdomain.example') WHERE option_name = 'home' OR option_name = 'siteurl';

UPDATE wp_posts SET guid = replace(guid, 'http://olddomain.example','http://newdomain.example');

UPDATE wp_posts SET post_content = replace(post_content, 'http://olddomain.example', 'http://newdomain.example');

UPDATE wp_posts SET post_excerpt = replace(post_excerpt, 'http://olddomain.example', 'http://newdomain.example');

UPDATE wp_postmeta SET meta_value = replace(meta_value, 'http://olddomain.example', 'http://newdomain.example');

REPLACE 명령으로 교체할 때는 주의하십시오!

왜요?

데이터베이스에 시리얼화된 데이터(특히 wp_parames 테이블)가 포함되어 있을 가능성이 높기 때문에 "대체"만 사용하면 데이터가 파손될 수 있습니다.

권장 직렬화 사용: https://puvox.software/tools/wordpress-migrator

이는 데이터가 처음부터 정규화되지 않았음을 강하게 시사합니다.

이와 같은 기능이 작동해야 합니다(다른 언어를 사용하는 것에 대해 언급하지 않은 NB는 MySQL 저장 프로시저로 작성됩니다.

 create procedure replace_all(find varchar(255), 
        replce varchar(255), 
        indb varcv=char(255))
 DECLARE loopdone INTEGER DEFAULT 0;
 DECLARE currtable varchar(100);
 DECLARE alltables CURSOR FOR SELECT t.tablename, c.column_name 
    FROM information_schema.tables t,
    information_schema.columns c
    WHERE t.table_schema=indb
    AND c.table_schema=indb
    AND t.table_name=c.table_name;

 DECLARE CONTINUE HANDLER FOR NOT FOUND
     SET loopdone = 1;

 OPEN alltables;

 tableloop: LOOP
    FETCH alltables INTO currtable, currcol; 
    IF (loopdone>0) THEN LEAVE LOOP;
    END IF;
         SET stmt=CONCAT('UPDATE ', 
                  indb, '.', currtable, ' SET ',
                  currcol, ' = word_sub(\'', find, 
                  '\','\'', replce, '\') WHERE ',
                  currcol, ' LIKE \'%', find, '%\'');
         PREPARE s1 FROM stmt;
         EXECUTE s1;
         DEALLOCATE PREPARE s1;
     END LOOP;
 END //

word_sub 함수를 선언하는 방법은 당신에게 맡기겠습니다.

간단한 답변:그럴수는 없어요.

장황한 답변:INFORMATION_SCHEMA를 사용하여 테이블 정의를 가져오고 이를 사용하여 필요한 UPDATE 문을 동적으로 생성할 수 있습니다.예를 들어 다음과 같이 시작할 수 있습니다.

SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_schema'

가능하다면 이 일을 피하려고 합니다.

MySQL 검색 및 치환 도구

MySQL 데이터베이스에서 텍스트 문자열을 쉽게 검색하고 바꿀 수 있는 매우 유용한 웹 기반 도구입니다.

MySQL에서도 같은 문제가 발생하였습니다.나는 symcbean의 시술을 받아 그녀를 내 필요에 맞게 개조했다.

저는 텍스트 값(또는 SELECT FROM information_schema에 입력한 모든 유형)만 치환하고 있기 때문에 날짜 필드가 있는 경우 실행 시 오류가 발생하지 않습니다.

SET @stmt 내의 대조는 데이터베이스 대조와 일치해야 합니다.

여러 개의 치환이 있는 변수에서 템플릿 요청을 사용했지만 동기 부여가 있다면 CONCAT() 하나로 할 수 있습니다.

어쨌든 데이터베이스에 직렬화된 데이터가 있는 경우 이를 사용하지 마십시오.같은 lenight의 문자열로 대체하지 않으면 동작하지 않습니다.

도움이 됐으면 좋겠는데

DELIMITER $$

DROP PROCEDURE IF EXISTS replace_all_occurences_in_database$$
CREATE PROCEDURE replace_all_occurences_in_database (find_string varchar(255), replace_string varchar(255))
BEGIN
  DECLARE loop_done integer DEFAULT 0;
  DECLARE current_table varchar(255);
  DECLARE current_column varchar(255);
  DECLARE all_columns CURSOR FOR
  SELECT
    t.table_name,
    c.column_name
  FROM information_schema.tables t,
       information_schema.columns c
  WHERE t.table_schema = DATABASE()
  AND c.table_schema = DATABASE()
  AND t.table_name = c.table_name
  AND c.DATA_TYPE IN('varchar', 'text', 'longtext');

  DECLARE CONTINUE HANDLER FOR NOT FOUND
  SET loop_done = 1;

  OPEN all_columns;

table_loop:
LOOP
  FETCH all_columns INTO current_table, current_column;
  IF (loop_done > 0) THEN
    LEAVE table_loop;
  END IF;
  SET @stmt = 'UPDATE `|table|` SET `|column|` = REPLACE(`|column|`, "|find|", "|replace|") WHERE `|column|` LIKE "%|find|%"' COLLATE `utf8mb4_unicode_ci`;
  SET @stmt = REPLACE(@stmt, '|table|', current_table);
  SET @stmt = REPLACE(@stmt, '|column|', current_column);
  SET @stmt = REPLACE(@stmt, '|find|', find_string);
  SET @stmt = REPLACE(@stmt, '|replace|', replace_string);
  PREPARE s1 FROM @stmt;
  EXECUTE s1;
  DEALLOCATE PREPARE s1;
END LOOP;
END
$$

DELIMITER ;

이 작업은 불가능합니다. 각 테이블에 대해 개별적으로 업데이트를 수행해야 합니다.

경고: 의심스럽지만 효과가 있습니다(PROBAB).LY) 솔루션은 다음과 같습니다.

또는 mysqldump를 통해 데이터베이스를 덤프하고 결과 SQL 파일에 대해 검색/교체를 수행할 수 있습니다(이 작업이 진행 중일 때 데이터베이스에 영향을 줄 수 있는 모든 항목과 --add-drop-table 및 --extended-insert 플래그를 사용할 것을 권장합니다).그러나 검색/바꾸기 텍스트가 데이터 자체 이외의 다른 것을 변경하지 않는지 확인해야 합니다(즉, 스왑 아웃하려는 텍스트가 SQL 구문의 일부로 표시되지 않을 수 있습니다). 먼저테스트 데이터베이스에서 다시 삽입을 시도합니다).

심플한 솔루션

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

phpMyAdmin에서 최소한의 변경만 있으면 쉽게 변경할 수 있습니다.

  • phpMyAdmin 로그인
  • 변경을 수행하는 데 필요한 데이터베이스를 선택합니다.
  • 검색 옵션을 클릭합니다.

    여기에 이미지 설명 입력

모든 테이블 또는 임의의 테이블을 언제든지 선택할 수 있습니다.검색 키워드를 지정하는 것을 잊지 말아 주세요.이 키워드는 와일드카드(%)로 사용됩니다.

  • [Go]를 클릭합니다.
  • 그러면 검색한 항목이 있는 모든 테이블이 표시됩니다.

여기에 이미지 설명 입력

  • 이제 각 테이블을 하나씩 열고 업데이트를 수행할 수 있습니다. 생성된 샘플 쿼리는 다음과 같습니다.

    * FROM 택 * selectsibeecst_passion.wp_ewwwio_images변환id'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。path'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。image_md5'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。results'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。gallery'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。image_size'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。orig_size'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。updates'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。updated'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。trace'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。attachment_id'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。resize'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。converted'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。level'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。pending'% CONVERTutf8) '%sibee%'( ) '( ) 를)을 。backupLIKE '%utf8) '%sibee%' ★

사용 사례에 따라 다른 옵션은 DataMystic의 TextPipeDataPipe 제품을 사용하는 것입니다.이전에 사용한 적이 있는데, 복잡한 교체 시나리오에서 데이터를 데이터베이스에서 내보내지 않고도 검색 및 교환이 가능합니다.

Chrome의 sessionbuddy db 파일에 있는 링크를 대체해야 했기 때문에 sql 데이터베이스와 이 찾기/바꾸기를 어떻게 했는지 공유하려고 합니다.

  • 그래서 SQLite Database Browser 2.0 b1을 사용하여 SQL 데이터베이스 파일을 .txt 파일로 내보냈습니다.
  • 메모장에서 찾기/바꾸기++
  • SQLite Database Browser 2.0 b1에서 .txt 파일을 Import.

언급URL : https://stackoverflow.com/questions/4822638/find-and-replace-entire-mysql-database

반응형