Otrzymuję ten dziwny błąd podczas przetwarzania dużej liczby danych ...
Error Number: 1267
Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'
Co mogę zrobić, aby rozwiązać ten problem? Czy mogę jakoś uciec od ciągu, aby ten błąd się nie pojawił, czy też muszę jakoś zmienić kodowanie mojej tabeli, a jeśli tak, to na co mam to zmienić?
mysql
sql
mysql-error-1267
Kliknij opcję Głos za
źródło
źródło
Odpowiedzi:
następnie dla twoich baz danych
MySQL wkrada się tam czasem po szwedzku bez rozsądnego powodu.
źródło
Powinieneś ustawić zarówno kodowanie tabeli, jak i kodowanie połączenia na
UTF-8
:i
źródło
myDb
DEFAULT ZESTAW ZNAKÓW utf8 SORTOWANIE utf8_bin. Czy to zadziała? Robi się to tak, aby wpłynęło to na wszystkie moje stoły, a nie tylko na jeden z nichRozwiązuje mój problem. Gdzie kolumna1 to kolumna, która wyświetla ten błąd.
źródło
Użyj poniższej instrukcji dla błędu
uważaj na swoje dane, wykonaj kopię zapasową, jeśli dane są w tabeli.
źródło
Ogólnie najlepszym sposobem jest zmiana sortowania tabeli. Jednak mam starą aplikację i nie jestem w stanie oszacować wyniku, czy ma to skutki uboczne. Dlatego próbowałem w jakiś sposób przekonwertować ciąg na inny format, który rozwiązał problem z sortowaniem. To, co znalazłem, to porównanie ciągów poprzez konwersję ciągów na szesnastkową reprezentację jego znaków. W bazie danych można to zrobić za pomocą
HEX(column).
Dla PHP możesz użyć tej funkcji:Podczas wykonywania zapytania do bazy danych, oryginalny łańcuch UTF8 musi najpierw zostać przekonwertowany na ciąg iso (np. Przy użyciu
utf8_decode()
w PHP) przed użyciem go w bazie danych. Ze względu na typ sortowania baza danych nie może zawierać znaków UTF8 w środku, więc porównanie powinno działać, chociaż powoduje to zmianę oryginalnego ciągu (konwersja znaków UTF8, które nie istnieją w zestawie znaków ISO, powoduje? Lub są one całkowicie usuwane). Po prostu upewnij się, że zapisując dane w bazie danych, używasz tej samej konwersji UTF8 na ISO.źródło
Pierwotnie utworzyłem tabelę z CHARSET = latin1 . Po konwersji tabeli na utf8 niektóre kolumny nie zostały przekonwertowane, jednak nie było to do końca oczywiste. Możesz spróbować uruchomić
SHOW CREATE TABLE my_table;
i zobaczyć, która kolumna nie została przekonwertowana lub po prostu naprawić nieprawidłowy zestaw znaków w problematycznej kolumnie za pomocą poniższego zapytania (zmień długość varchar oraz ZESTAW ZNAKÓW i SORTOWANIE zgodnie z potrzebami):źródło
Zmień zestaw znaków tabeli na utf8
źródło
Po wprowadzeniu poprawek wymienionych w pierwszej odpowiedzi zmień domyślne ustawienia serwera.
W swoim „ /etc/my.cnf.d/server.cnf ” lub gdziekolwiek się znajduje, dodaj wartości domyślne do sekcji [mysqld], aby wyglądało to tak:
Źródło: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
źródło
Stwierdziłem, że
cast()
najlepszym rozwiązaniem jest dla mnie używanie :Jest też
convert()
funkcja. Więcej szczegółów na ten temat tutajKolejny zasób tutaj
źródło
Moje konto użytkownika nie miało uprawnień do zmiany bazy danych i tabeli, jak zasugerowano w tym rozwiązaniu .
Jeśli tak jak ja nie obchodzi Cię sortowanie znaków (używasz operatora „=”), możesz zastosować poprawkę odwrotną. Uruchom to przed SELECT:
źródło