Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да премахнете лоши знаци, които не са подходящи за utf8 кодиране в MySQL?

Когато имах подобен проблем, използвах Perl скрипт, за да гарантирам, че данните се преобразуват във валиден UTF-8, като използвам код като този:

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

Този скрипт приема (евентуално повреден) UTF-8 на stdin и отпечатва повторно валиден UTF-8 в stdout . Невалидните знаци се заменят с (U+FFFD , Заместващ символ в Unicode ).

Ако стартирате този скрипт на добър UTF-8 вход, изходът трябва да е идентичен с входния.

Ако имате данни в базата данни, има смисъл да използвате DBI, за да сканирате вашата таблица(и) и да изтриете всички данни, като използвате този подход, за да се уверите, че всичко е валидно UTF-8.

Това е едноредова версия на Perl на същия скрипт:

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

РЕДАКТИРАНЕ:Добавено решение само за Java .

Това е пример как да направите това в 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изтрия един файл от медиен магазин?

  2. Проблем с PDO bindParam

  3. създаване на масив от база данни

  4. PHP уеб приложение:въпрос за най-добри практики за дизайн на база данни на mysql

  5. Заключване на mysql таблица с php