Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak usunąć złe znaki, które nie nadają się do kodowania utf8 w MySQL?

Kiedy miałem taki problem, użyłem skryptu Perla, aby upewnić się, że dane są konwertowane do prawidłowego UTF-8 za pomocą kodu takiego:

use Encode;
binmode(STDOUT, ":utf8");
while (<>) {
    print Encode::decode('UTF-8', $_);
}

Ten skrypt pobiera (prawdopodobnie uszkodzony) kod UTF-8 na stdin i ponownie drukuje poprawny kod UTF-8 na stdout . Nieprawidłowe znaki są zastępowane przez (U+FFFD , Znak zastępujący Unicode ).

Jeśli uruchomisz ten skrypt na dobrym wejściu UTF-8, dane wyjściowe powinny być identyczne z danymi wejściowymi.

Jeśli masz dane w bazie danych, sensowne jest użycie DBI do przeskanowania tabeli (tabeli) i przeszukania wszystkich danych przy użyciu tego podejścia, aby upewnić się, że wszystko jest poprawne UTF-8.

To jest jednowierszowa wersja tego samego skryptu w Perlu:

perl -MEncode -e "binmode STDOUT,':utf8';while(<>){print Encode::decode 'UTF-8',\$_}" < bad.txt > good.txt

EDYCJA:Dodano rozwiązanie tylko dla Javy .

Oto przykład, jak to zrobić w Javie:

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CodingErrorAction;

public class UtfFix {
    public static void main(String[] args) throws InterruptedException, CharacterCodingException {
        CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
        decoder.onMalformedInput(CodingErrorAction.REPLACE);
        decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
        ByteBuffer bb = ByteBuffer.wrap(new byte[] {
            (byte) 0xD0, (byte) 0x9F, // 'П'
            (byte) 0xD1, (byte) 0x80, // 'р'
            (byte) 0xD0,              // corrupted UTF-8, was 'и'
            (byte) 0xD0, (byte) 0xB2, // 'в'
            (byte) 0xD0, (byte) 0xB5, // 'е'
            (byte) 0xD1, (byte) 0x82  // 'т'
        });
        CharBuffer parsed = decoder.decode(bb);
        System.out.println(parsed);
        // this prints: Пр?вет
    }
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwersja mysql TIME z 24 GODZIN na format AM/PM

  2. Jak zamawiać według daty w MySQL

  3. Pytanie dotyczące najlepszych praktyk dla MySQL:kolejność według identyfikatora czy daty?

  4. Zamówienie i limit LEFT JOIN

  5. Jak korzystać z Coalesce w MySQL