Niedozwolona kombinacja zestawień Błąd MySQL


124

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ć?


ten błąd to do wstrzyknięcia czy nie?
— hamza irizaj

1
Czy to odpowiada na twoje pytanie? Niedozwolona kombinacja błędów sortowania w MySql
— Farhan

Odpowiedzi:


289
SET collation_connection = 'utf8_general_ci';

następnie dla twoich baz danych

ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

MySQL wkrada się tam czasem po szwedzku bez rozsądnego powodu.


3
@Ben: Dziękuję za rozwiązanie do bezpośredniego kopiowania i wklejania. Zaoszczędziło mi mnóstwo czasu.
— Pistos

15
@Ben: Początkowo został opracowany przez szwedzką firmę ... To jest przyczyna irytujących początkowych ustawień latin1_swedish_ci .. :(
— Vajk Hermecz

1
Nie masz uprawnień do zrobienia pierwszego komunikatu, ale to działało po prostu robi tabelę
— Rob Sedgwick

Kocham cię za to! : P
— prateekkathal

Wygląda na to, że to działa dla wielu osób, ale niestety nadal mam ten problem, nawet po wypróbowaniu całego urządzenia w tym wątku. Domyślne sortowanie mojej bazy danych uparcie odmawia zmiany z „ucs2_bin”, więc próbowałem nawet zmienić wszystkie tabele i sortowanie połączeń na „usc2_bin”, ale nadal otrzymuję błąd „Błąd SQL (1267): Niedozwolona kombinacja sortowań (utf8_general_ci, IMPLICIT) i (ucs2_bin, IMPLICIT) dla operacji '=' ".
— bikeman868

15

Powinieneś ustawić zarówno kodowanie tabeli, jak i kodowanie połączenia na UTF-8:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

i

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';

Czy oba są potrzebne, czy mogę po prostu wykonać jedną z nich?
— Kliknij opcję Głos za głosem

ALTER DATABASE 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 nich
— kliknij Upvote

1
ALTER DATABASE nie zmieni aktualnych ustawień tabeli, tylko nowo utworzone. Jednak zmiana domyślnego zestawu znaków również dla bazy danych nie zaszkodzi.
— Quassnoi

SET NAMES i SET CHARACTER SET zmienią kodowanie połączenia. Musisz wydawać te polecenia przy każdym połączeniu. Twoja biblioteka klienta może obsługiwać bardziej elegancką metodę (php :: mysqli tak, php :: mysql nie).
— Quassnoi

Wydaje się, że na razie działa, zaakceptuję po kilku dalszych testach. Czy drugie zapytania należy uruchamiać raz, czy na początku każdego skryptu?
— Kliknij opcję Głos za głosem

13
CONVERT(column1 USING utf8)

Rozwiązuje mój problem. Gdzie kolumna1 to kolumna, która wyświetla ten błąd.


U mnie zadziałało: CONVERT ("column1" USING LATIN1)
— shasi kanth

4

Użyj poniższej instrukcji dla błędu

uważaj na swoje dane, wykonaj kopię zapasową, jeśli dane są w tabeli.

 ALTER TABLE twoja_nazwa_tabeli KONWERTUJ NA ZESTAW ZNAKÓW utf8 Sortuj utf8_general_ci;

2

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:

public static function strToHex($string)
{
    $hex = '';
    for ($i=0; $i<strlen($string); $i++){
        $ord = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex .= substr('0'.$hexCode, -2);
    }
    return strToUpper($hex);
}

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.


2

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):

 ALTER TABLE `my_table` CHANGE `my_column` `my_column` VARCHAR(10) CHARSET utf8 
 COLLATE utf8_general_ci NULL;


0

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:

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

Źródło: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html


0

Stwierdziłem, że cast()najlepszym rozwiązaniem jest dla mnie używanie :

cast(Format(amount, "Standard") AS CHAR CHARACTER SET utf8) AS Amount

Jest też convert()funkcja. Więcej szczegółów na ten temat tutaj

Kolejny zasób tutaj


0

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:

SET collation_connection = 'latin1_swedish_ci';
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.