Campuran kolasi ilegal Kesalahan MySQL

124

Saya mendapatkan kesalahan aneh ini saat memproses data dalam jumlah besar ...

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 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

Apa yang dapat saya lakukan untuk mengatasi ini? Dapatkah saya melepaskan string entah bagaimana agar kesalahan ini tidak terjadi, atau apakah saya perlu mengubah pengkodean tabel saya, dan jika demikian, apa yang harus saya ubah?

Klik Suka
sumber
kesalahan ini, itu suntik atau tidak?
hamza irizaj
1
Apakah ini menjawab pertanyaan Anda? Kesalahan perpaduan kesalahan pengumpulan ilegal di MySql
Farhan

Jawaban:

288
SET collation_connection = 'utf8_general_ci';

lalu untuk database Anda

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 menyelinap ke Swedia kadang-kadang tanpa alasan yang masuk akal.

Ben Hughes
sumber
3
@ Ben: Terima kasih atas solusi salin-tempel langsung. Menghemat banyak waktu saya.
Pistos
15
@Ben: Awalnya dikembangkan oleh perusahaan Swedia ... Itulah alasan di balik pengaturan awal latin1_swedish_ci yang mengganggu .. :(
Vajk Hermecz
1
Saya tidak memiliki izin untuk melakukan pernyataan pertama tetapi berfungsi hanya dengan melakukan tabel
Rob Sedgwick
Aku mencintaimu untuk ini! : P
prateekkathal
Sepertinya ini berfungsi untuk banyak orang, tetapi sayangnya saya masih mengalami masalah ini bahkan setelah mencoba semua perangkat di utas ini. Pemeriksaan default database saya dengan keras kepala menolak untuk mengubah dari 'ucs2_bin' sehingga bahkan mencoba mengubah semua tabel dan pemeriksaan koneksi ke 'usc2_bin' tetapi saya masih mendapatkan kesalahan "Kesalahan SQL (1267): Campuran pemeriksaan ilegal (utf8_general_ci, IMPLICIT) dan (ucs2_bin, IMPLICIT) untuk operasi '=' ".
bikeman868
15

Anda harus menyetel encoding tabel dan encoding koneksi ke UTF-8:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

dan

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';
Quassnoi
sumber
Apakah keduanya diperlukan, atau dapatkah saya melakukan salah satunya?
Klik Upvote
ALTER DATABASE myDbDEFAULT CHARACTER SET utf8 COLLATE utf8_bin. Apakah itu akan berhasil? Ini dilakukan sehingga akan mempengaruhi semua tabel saya, tidak hanya satu dari mereka
Klik Suara Positif
1
ALTER DATABASE tidak akan mengubah pengaturan tabel Anda saat ini, hanya yang baru dibuat. Meskipun tidak ada salahnya untuk mengubah charset default untuk database juga.
Quassnoi
SET NAMA dan SET CHARACTER SET akan mengubah penyandian koneksi Anda. Anda perlu mengeluarkan perintah ini setiap kali Anda terhubung. Perpustakaan klien Anda mungkin mendukung metode yang lebih elegan untuk melakukannya (php :: mysqli tidak, php :: mysql tidak).
Quassnoi
Tampaknya berfungsi untuk saat ini, saya akan menerima setelah beberapa pengujian lagi. Apakah kueri kedua perlu dijalankan satu kali, atau di awal setiap skrip?
Klik Upvote
13
CONVERT(column1 USING utf8)

Memecahkan masalah saya. Di mana kolom1 adalah kolom yang memberi saya kesalahan ini.

Binaya Shrestha
sumber
Bagi saya, ini berhasil: CONVERT ("kolom1" MENGGUNAKAN LATIN1)
shasi kanth
4

Gunakan pernyataan berikut untuk kesalahan

hati-hati tentang data Anda, ambil cadangan jika data ada di tabel.

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
vpgodara
sumber
2

Secara umum cara terbaik adalah dengan mengubah susunan tabel. Namun saya memiliki aplikasi lama dan tidak benar-benar dapat memperkirakan hasilnya apakah ini memiliki efek samping. Oleh karena itu saya mencoba entah bagaimana mengubah string menjadi beberapa format lain yang memecahkan masalah pemeriksaan. Apa yang saya temukan berfungsi adalah melakukan perbandingan string dengan mengubah string menjadi representasi heksadesimal dari karakternya. Pada database ini dilakukan dengan HEX(column).Untuk PHP Anda dapat menggunakan fungsi ini:

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);
}

Saat melakukan query database, string UTF8 asli Anda harus diubah terlebih dahulu menjadi string iso (misalnya menggunakan utf8_decode()PHP) sebelum menggunakannya di DB. Karena jenis pemeriksaan, database tidak dapat memiliki karakter UTF8 di dalamnya sehingga acara perbandingan harus berfungsi meskipun ini mengubah string asli (mengonversi karakter UTF8 yang tidak ada dalam ISO charset menghasilkan? Atau ini dihapus seluruhnya). Pastikan bahwa saat Anda menulis data ke database, Anda menggunakan konversi UTF8 ke ISO yang sama.

Stephan
sumber
2

Saya memiliki tabel yang awalnya dibuat dengan CHARSET = latin1 . Setelah tabel diubah menjadi utf8 beberapa kolom tidak dikonversi, namun itu tidak terlalu jelas. Anda dapat mencoba menjalankan SHOW CREATE TABLE my_table;dan melihat kolom mana yang tidak dikonversi atau hanya memperbaiki kumpulan karakter yang salah pada kolom bermasalah dengan kueri di bawah ini (ubah panjang varchar dan CHARSET dan COLLATE sesuai kebutuhan Anda):

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

Ubah kumpulan karakter tabel menjadi utf8

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8

Jamsheer Mohammed
sumber
0

Setelah membuat koreksi Anda terdaftar di jawaban atas, ubah pengaturan default server Anda.

Di " /etc/my.cnf.d/server.cnf " Anda atau di mana pun lokasinya, tambahkan default ke bagian [mysqld] sehingga terlihat seperti ini:

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

Sumber: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html

ITI
sumber
0

Saya menemukan bahwa menggunakan cast()adalah solusi terbaik untuk saya:

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

Ada juga convert()fungsinya. Detail lebih lanjut di sini

Sumber daya lain di sini

Nitin Nanda
sumber
0

Akun pengguna saya tidak memiliki izin untuk mengubah database dan tabel, seperti yang disarankan dalam solusi ini .

Jika, seperti saya, Anda tidak peduli dengan susunan karakter (Anda menggunakan operator '='), Anda dapat menerapkan perbaikan terbalik. Jalankan ini sebelum PILIH Anda:

SET collation_connection = 'latin1_swedish_ci';
pyb
sumber