2013-04-18 6 views
1

1 년 전 데이터를 MySQL로 마이그레이션했습니다. 인코딩 불일치로 인해 이상한 문자 (Ã, ª, € 등)가 레코드에 삽입되었습니다. 우리는 전체 데이터베이스에서 이러한 모든 문자를 추적하려고합니다.mysql에서 이상한 문자 찾기

다음 쿼리를 시도했습니다.

select * from <table_name> where <field_name> regexp '[^a-zA-Z0-9&,$\'"() .-]' 

그것은 나에게 떨어져 AZ, AZ, 0-9, &, 쉼표, 달러, 단일 인용, 큰 따옴표, 괄호, 공간, 시대의 모든 문자가있는 모든 항목을 제공합니다 , 특정 테이블의 <field_name>에있는 하이픈

그러나 약 20 개의 필드가있는 약 93 개의 테이블이 있으므로 모든 이상한 문자를 찾는 데는 많은 시간이 걸립니다.

더 나은 방법으로 문제를 해결할 수 있습니까?

적절한 인코딩 설정으로 다시 다시 다시 가져 오는 것은 데이터가 그 이후로 많이 변경 되었기 때문에 옵션이 아닙니다.

+0

인코딩 불일치를 확인하고 수정 했습니까? 그렇다면 추적을 유지하는 것보다는 오류를 하나씩 수정하는 것이 가장 좋습니다. – cmbuckley

+0

우리는 인코딩 불일치가 무엇인지 압니다. 하지만 너무 늦어서이를 수정하고 다시 마이그레이션하십시오. 질문에서 언급 한 것과 같은 쿼리를 사용하여 모든 문자를 찾는 데는 많은 시간이 필요할 것입니다. 더 나은 접근 방법이 있습니까? – Taran

답변

1

언급 한 문자는 ASCII 또는 Latin-1 8 비트 문자 인 것처럼 렌더링 된 utf-8 데이터와 유사합니다.

다음은 문제를 찾는 방법에 대한 게시물입니다. 그것은 당신의 접근 방식보다 효과적이며, 문자 세트 매칭에 대해 매우 훈련되어 있습니다.

How can I find non-ASCII characters in MySQL?

당신이 쓰레기를 포함하는 테이블 중 하나의 테이블 정의를 제공 할 수 있습니까? 그렇게하면 테이블과 열의 문자 집합과 데이터 정렬 설정을 볼 수 있습니다.

+0

CREATE TABLE'Recipe' ( \t'Recipe_Id' BIGINT (20) NOT NULL AUTO_INCREMENT, \t'Language' VARCHAR (255)의 NULL DEFAULT의 NULL, \t'Brand_Id' BIGINT (20) NULL NOT, \t'Is_Deleted' TINYINT (1) NOT NULL, \t'Brand_Reference_No' VARCHAR (255) NULL시 기본 NULL, \t'Display_Title' VARCHAR (255) NOT NULL로, ... 등등. 나는 다른 링크 답변을 보았다. 내게 훨씬 나은 접근 방식. – Taran