sql >> Database teknologi >  >> RDS >> Mysql

Hvordan fjerner man dårlige tegn, der ikke er egnede til utf8-kodning i MySQL?

Da jeg havde et problem som dette, brugte jeg Perl-script til at sikre, at data konverteres til gyldig UTF-8 ved at bruge kode som denne:

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

Dette script tager (muligvis beskadiget) UTF-8 på stdin og genudskriver gyldig UTF-8 til stdout . Ugyldige tegn erstattes med (U+FFFD , Unicode-erstatningstegn ).

Hvis du kører dette script på god UTF-8 input, skal output være identisk med input.

Hvis du har data i databasen, giver det mening at bruge DBI til at scanne dine tabeller og skrubbe alle data ved hjælp af denne tilgang for at sikre, at alt er gyldigt UTF-8.

Dette er Perl one-liner version af det samme script:

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

EDIT:Tilføjet Java-only-løsning .

Dette er et eksempel på, hvordan man gør dette i Java:

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. Er der nogen, der har fundet ud af, hvordan man skalerer Amazon RDS læsereplikaer?

  2. Er det muligt at forespørge en træstrukturtabel i MySQL i en enkelt forespørgsel, til enhver dybde?

  3. Brug af MySQL relationelle databaser på Gentoo

  4. Tvetydig spalte i INNER JOIN-erklæring