Oto jak ustawia się moje połączenie:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);
I pojawia się następujący błąd podczas wiązania w celu dodania wiersza do tabeli:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1
Wstawiam tysiące rekordów i zawsze pojawia się ten błąd, gdy tekst zawiera \ xF0 (tj. Niepoprawna wartość ciągu zawsze zaczyna się od \ xF0).
Zestawienie kolumny to utf8_general_ci.
Co może być problemem?
Odpowiedzi:
MySQL
utf8
dopuszcza tylko znaki Unicode, które mogą być reprezentowane 3 bajtami w UTF-8. Tutaj masz znak, który potrzebuje 4 bajtów: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 GOTHIC LITTER SAUIL ).Jeśli masz MySQL 5.5 lub nowszy, możesz zmienić kodowanie kolumn z
utf8
nautf8mb4
. To kodowanie umożliwia przechowywanie znaków zajmujących 4 bajty w UTF-8.Można również ustawić właściwość serwera
character_set_server
, abyutf8mb4
w pliku konfiguracyjnym MySQL. Wygląda na to, że inaczej Connector / J ma domyślnie 3-bajtowy Unicode :źródło
character_encoding_server
nie jest prawidłową nazwą zmiennej konfiguracyjnej MySQL. Próbowałem zestawcharacter_set_server
doutf8mb4
zamiast, oprócz poszczególnych kolumn, ale to niczego nie zmienia.Zawarte w niej ciągi znaków
\xF0
to po prostu znaki zakodowane jako wiele bajtów za pomocą UTF-8.Mimo że sortowanie jest ustawione na utf8_general_ci, podejrzewam, że kodowanie znaków w bazie danych, tabeli lub nawet kolumnie może być inne. Są to niezależne ustawienia . Próbować:
Zastąp bez względu na faktyczny typ danych VARCHAR (255)
źródło
file-encoding
parametrem określającym UTF-8, np.java -Dfile.encoding=UTF-8
Lub dodaj odpowiedni przełącznik w pliku konfiguracyjnym Tomcat (itp.).Masz ten sam problem, aby zapisać dane,
utf8mb4
musisz się upewnić:character_set_client, character_set_connection, character_set_results
areutf8mb4
:character_set_client
icharacter_set_connection
wskazują zestaw znaków, w którym klient wysyła instrukcje,character_set_results
wskazuje zestaw znaków, w którym serwer zwraca klientowi wyniki zapytania.Zobacz charset-connection .
kodowanie tabeli i kolumny to
utf8mb4
W przypadku JDBC istnieją dwa rozwiązania:
Rozwiązanie 1 (trzeba ponownie uruchomić MySQL):
zmodyfikuj
my.cnf
jak poniżej i zrestartuj MySQL:może to zapewnić, że baza danych
character_set_client, character_set_connection, character_set_results
jestutf8mb4
domyślnie.zrestartuj MySQL
zmień kodowanie tabeli i kolumny na
utf8mb4
Stop określania
characterEncoding=UTF-8
icharacterSetResults=UTF-8
w jdbc złącza powodować zastąpicharacter_set_client
,character_set_connection
,character_set_results
doutf8
Rozwiązanie drugie (nie trzeba restartować MySQL):
zmień kodowanie tabeli i kolumny na
utf8mb4
określając
characterEncoding=UTF-8
w złączu jdbc, ponieważ złącze jdbc nie obsługujeutf8mb4
.napisz swoją instrukcję SQL w następujący sposób (musisz dodać
allowMultiQueries=true
do konektora jdbc):Dzięki temu każde połączenie z serwerem
character_set_client,character_set_connection,character_set_results
będzieutf8mb4
.Zobacz także charset-connection .
źródło
SELECT
zapytań, ponieważset names utf8mb4; select ... from ...
nigdy nie wygeneruje a,ResultSet
a zamiast tego spowodujeResultSet is from UPDATE. No Data.
błąd.Chciałem połączyć kilka postów, aby uzyskać pełną odpowiedź na to pytanie, ponieważ wydaje się, że to kilka kroków.
/etc/mysql/my.cnf
lub/etc/mysql/mysql.conf.d/mysqld.cnf
Ponownie z porad wynika, że wszystkie połączenia jdbc miały
characterEncoding=UTF-8
icharacterSetResults=UTF-8
zostały z nich usunięteZ tym zestawem
-Dfile.encoding=UTF-8
wydawało się, że nie ma znaczenia.Nadal nie mogłem napisać międzynarodowego tekstu do db, otrzymując taką samą awarię jak powyżej
Teraz korzystamy z tego jak przekonwertować-cały-mysql-database-characterset-and-collation-to-utf-8
Zaktualizuj całą bazę danych do użycia
utf8mb4
Uruchom to zapytanie, które daje ci to, co należy szczebla
Kopiuj wyniki wklejania w edytorze zastąp wszystkie | nic nie przesyła z powrotem do mysql po podłączeniu do poprawnej bazy danych.
To wszystko, co trzeba było zrobić i wydaje mi się, że wszystko działa. Nie -
Dfile.encoding=UTF-8
nie jest włączony i wydaje się działać zgodnie z oczekiwaniamiE2A Nadal masz problem? Z pewnością jestem w produkcji, więc okazuje się, że musisz sprawdzić, co zostało zrobione powyżej, ponieważ czasami to nie działa, oto powód i naprawa w tym scenariuszu:
Widać, że niektórzy nadal łacińscy próbują ręcznie zaktualizować rekord:
Więc zawęźmy to:
Krótko mówiąc musiałem zmniejszyć rozmiar tego pola, aby aktualizacja działała.
Teraz kiedy biegnę:
To wszystko działa
źródło
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
dziwnie, kiedy uruchomiłem to po raz ostatni, wszystkie pola nie miały już zdefiniowanego zestawu znaków. więc hasło z góry stało siępassword
varchar (255) NOT NULL, (nic o kodowaniu). Oznacza to, że ostatnie polecenie po prostu sprawiło, że mysql sprawdziło, jaka była rzeczywista definicja tabeli, a ponieważ teraz tabela była domyślnie tym, pola już jej nie potrzebują - zakładam, że pozostały z zestawem znaków po prostu dlatego, że podczas zrzutu całej aktualizacji tabeli nie mógł go zaktualizować i dlatego został pozostawiony w tym stanieW moim przypadku próbowałem wszystkiego powyżej, nic nie działało. Jestem całkiem pewien, że moja baza danych wygląda jak poniżej.
więc sprawdzam zestaw znaków kolumny w każdej tabeli
Okazuje się, że zestaw znaków kolumny jest łaciński. Dlatego nie mogę wstawić chińskiego do bazy danych.
To może ci pomóc. :)
źródło
Miałem ten sam problem w moim projekcie szyn:
Rozwiązanie 1: przed zapisaniem do db przekonwertuj ciąg znaków na base64 przez
Base64.encode64(subject)
i po pobraniu z dbBase64.decode64(subject)
Rozwiązanie 2:
Krok 1: Zmień zestaw znaków (i układanie) dla kolumny tematu o
Krok 2: W użyciu database.yml
źródło
po prostu zrób
źródło
Zakładając, że używasz phpmyadmin do rozwiązania tego błędu, wykonaj następujące kroki:
latin1_swedish_ci
(lub cokolwiek to jest) nautf8_general_ci
źródło
Jest to głównie spowodowane niektórymi znakami Unicode. W moim przypadku był to symbol waluty rupii.
Aby to szybko naprawić, musiałem zauważyć postać powodującą ten błąd. Skopiowałem wkleiłem cały tekst w edytorze tekstu, takim jak vi, i zastąpiłem problematyczny znak tekstowym.
źródło
Miałem ten problem z aplikacją PLAY Java. To jest mój ślad stosu dla tego wyjątku:
Próbowałem zapisać rekord za pomocą io.Ebean. Naprawiłem to, ponownie tworząc moją bazę danych z sortowaniem utf8mb4, i zastosowałem ewolucję odtwarzania, aby ponownie utworzyć wszystkie tabele, tak aby wszystkie tabele mogły zostać odtworzone z sortowaniem utf-8.
źródło
Jeśli chcesz zastosować zmianę tylko do jednego pola, możesz spróbować serializować to pole
źródło
Jeśli tworzysz nową tabelę MySQL, możesz określić zestaw znaków dla wszystkich kolumn podczas tworzenia, co rozwiązało problem.
Możesz przeczytać więcej szczegółów: https://dev.mysql.com/doc/refman/8.0/en/charset-column.html
źródło
nie jest to rozwiązanie rekomendacyjne. Ale warto się tym podzielić. Ponieważ moim projektem jest aktualizacja DBMS ze starego MySQL do najnowszego (8). Ale nie mogę zmienić struktury tabeli, tylko konfiguracja DBMS (mysql). Rozwiązanie dla serwera mysql.
test w systemie Windows mysql 8.0.15 podczas wyszukiwania konfiguracji mysql
odkomentuj to. Lub w moim przypadku po prostu wpisz / dodaj
dlaczego nie zalecane rozwiązanie. ponieważ jeśli użyjesz latin1 (mój przypadek) .. dane wstawiane są sukcesywnie, ale nie zawartość (mysql nie odpowiada błędem !!). na przykład wpisujesz takie informacje
to oszczędza
ok .. dla mojego problemu .. Mogę zmienić pole na UTF8 .. Ale jest mały problem .. patrz wyżej odpowiedź o innym rozwiązaniu nie powiodła się, ponieważ słowo nie zostało wstawione, ponieważ zawiera więcej niż 2 bajty (cmiiw) .. to rozwiązanie sprawi, że wstawione dane staną się skrzynkami. Rozsądne jest użycie obiektu blob ... i możesz pominąć moją odpowiedź.
Kolejnymi związanymi z tym testami były .. użycie utf8_encode w kodzie przed zapisaniem. Używam na latin1 i to był sukces (nie używam trybu sql )! taka sama jak powyższa odpowiedź przy użyciu base64_encode .
Moja sugestia, aby przeanalizować wymagania dotyczące tabeli i próbować zmienić z innego formatu na UTF8
źródło
moim rozwiązaniem jest zmiana typu kolumny z varchar (255) na blob
źródło
Musisz ustawić utf8mb4 w meta html, a także na serwerze zmienić tabelę i ustawić sortowanie na utf8mb4
źródło
Wskazówka: W systemie AWS RDS potrzebujesz nowej grupy parametrów dla bazy danych MySQL z parametrami (zamiast edycji pliku my.cnf)
Uwaga: character_set_system pozostaje „utf8”
Te polecenia SQL NIE DZIAŁAJĄ STAŁO - tylko podczas sesji:
źródło
Musiałem także usunąć i ponownie utworzyć wszystkie procedury przechowywane w bazie danych (i funkcje), aby mogły zostać wykonane w ramach nowego zestawu znaków utf8mb4.
Biegać:
… Aby zobaczyć, które procedury nie zostały zaktualizowane do nowych wartości server_set_client, collation_connection i Database Collation.
źródło