2014-07-09 4 views
0

일부 특수 문자 ("Ä, ä, ö, ö, Ü, ü, ß")가 포함 된 mysql 덤프가 있습니다. 이 덤프를 최신 MySQL 버전으로 다시 가져와야합니다. 인코딩 때문에 특수 문자가 충돌합니다. 덤프는 UTF-8로 인코딩되지 않습니다.C#에서 덤프 파일의 특정 바이트를 덮어 쓰는 방법

이 덤프에는 덮어 써서는 안되는 바이너리 첨부 파일도 있습니다. 그렇지 않으면 첨부 파일이 손상됩니다.

모든 특수 문자를 UTF-8에서 읽을 수있는 바이트로 덮어 써야합니다.

것은 나는 현재 (이 UTF-8이 읽을 수 ü에 대한에 ANSI의 ü를 변화) 그런 식으로 노력하고있어 :

newByteArray[y] = 195; 
if (bytesFromLine[i] == 252) 
{ 
    newByteArray[y + 1] = 188; 
} 

newByteArray[y + 2] = bytesFromLine[y + 1]; 

252 Encoding.Default에서 'ü'를 표시한다. 195 188에서 Encoding.UTF8에 'ü'가 표시됩니다.

지금 나는이 오른쪽 바이트 바이트 덮어 쓰기 파일이 덤프에서이 특정 문자를 검색하여 도움이 필요합니다. 나는 모든 '252'를 '195 188'로 바꿀 수 없다. 왜냐하면 첨부 파일이 부서지기 때문이다.

미리 감사드립니다.

+0

utf8에서 mysql 덤프를 가져올 수 없습니까? – ziya

+0

@MaxwellTroyMiltonKing 그렇지 않습니다. 이미 준비가되었습니다. – Relax

+0

명령 행 가져 오기 프로그램에서'--default-character-set' 인수를 사용해 보셨나요? 이것이 덤프 파일의 인코딩과 일치하는지 확인하십시오 (텍스트 편집기에서 열면 헤더에서 가져올 수 있어야합니다). –

답변

1

부인 휴식을 취 : 데이터 손상이 힘을. 이것을 처리하는 가장 좋은 방법은 소스 데이터베이스에서 적절한 mysqldump를 얻는 것이다. 이 솔루션은 해당 옵션이없고 잠재적으로 손상된 덤프 파일로 고정 된 경우에만 사용해야합니다. 따옴표로 덤프 파일의 모든 문자열을 가정

(따옴표 ' 사용) \'로 이스케이프 할 수 있습니다 표현 방법 이진 데이터가 너무 확실하지

INSERT INTO `some_table` VALUES (123, 'this is a string', ... 

합니다. 더 많은 수표가 필요하면 덤프 파일을 확인하고 이러한 가정이 정확한지 확인해야합니다.

const char quote = '\''; 
const char escape = '\\'; 

using (var dumpOut = new FileStream("dump_out.txt", FileMode.Create, FileAccess.Write)) 
using (var dumpIn = new FileStream("dump_in.txt", FileMode.Open, FileAccess.Read)) 
{ 
    bool inquotes = false; 
    byte previousByte = 0; 
    var stringBytes = new List<byte>(); 
    while (true) 
    { 
     int readByte = dumpIn.ReadByte(); 
     if (readByte == -1) break; 

     var b = (byte) readByte; 

     if (b == quote && previousByte != escape) 
     { 
      if (inquotes) // closing quote 
      { 
       var buffer = stringBytes.ToArray(); 
       stringBytes.Clear(); 

       byte[] converted = Encoding.Convert(Encoding.Default, Encoding.UTF8, buffer); 

       dumpOut.Write(converted, 0, converted.Length); 
       dumpOut.WriteByte(b); 
      } 
      else // opening quote 
      { 
       dumpOut.WriteByte(b); 
      } 

      inquotes = !inquotes; 
      continue; 
     } 

     previousByte = b; 

     if (inquotes) 
      stringBytes.Add(b); 
     else 
      dumpOut.WriteByte(b); 
    } 
} 
+0

내가 잘못되었거나이 덤프의 모든 텍스트를 utf8로 변환 중입니까? 그리고 인용과 탈출은 무엇입니까? – Relax

+0

예. 따옴표로 묶은 문자열 만 변환합니다. 그래도 이진 데이터에 대해서는 확신하지 못합니다. 동일한 따옴표를 사용하여 표현할 수 있습니다.이 경우 더 많은 검사가 필요합니다. – ziya

+0

무언가가 깨졌습니다.MySQL : # 1046 - 데이터베이스가 선택되지 않았습니다. – Relax