Pesan kesalahan di MySql:
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
Saya telah melewati beberapa posting lain dan tidak dapat menyelesaikan masalah ini. Bagian yang terpengaruh adalah sesuatu yang mirip dengan ini:
CREATE TABLE users (
userID INT UNSIGNED NOT NULL AUTO_INCREMENT,
firstName VARCHAR(24) NOT NULL,
lastName VARCHAR(24) NOT NULL,
username VARCHAR(24) NOT NULL,
password VARCHAR(40) NOT NULL,
PRIMARY KEY (userid)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE products (
productID INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(104) NOT NULL,
picturePath VARCHAR(104) NULL,
pictureThumb VARCHAR(104) NULL,
creationDate DATE NOT NULL,
closeDate DATE NULL,
deleteDate DATE NULL,
varPath VARCHAR(104) NULL,
isPublic TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
PRIMARY KEY (productID)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE productUsers (
productID INT UNSIGNED NOT NULL,
userID INT UNSIGNED NOT NULL,
permission VARCHAR(16) NOT NULL,
PRIMARY KEY (productID,userID),
FOREIGN KEY (productID) REFERENCES products (productID) ON DELETE RESTRICT ON UPDATE NO ACTION,
FOREIGN KEY (userID) REFERENCES users (userID) ON DELETE RESTRICT ON UPDATE NO ACTION
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Prosedur tersimpan yang saya gunakan adalah ini:
CREATE PROCEDURE updateProductUsers (IN rUsername VARCHAR(24),IN rProductID INT UNSIGNED,IN rPerm VARCHAR(16))
BEGIN
UPDATE productUsers
INNER JOIN users
ON productUsers.userID = users.userID
SET productUsers.permission = rPerm
WHERE users.username = rUsername
AND productUsers.productID = rProductID;
END
Saya menguji dengan php, tetapi kesalahan yang sama diberikan dengan SQLyog. Saya juga telah menguji membuat ulang seluruh DB tetapi tidak baik.
Bantuan apa pun akan sangat dihargai.
sumber
COLLATE utf8_unicode_ci
ke konstanta string:SET @EMAIL = '[email protected]' COLLATE utf8_unicode_ci;
. Ini sangat berguna jika Anda menjalankan skrip dari konsol, di mana pengkodean default konsol berlaku untuk susunan string konstanta Anda.(utf8mb4_unicode_ci, IMPLICIT)
bukannya(utf8_unicode_ci, IMPLICIT)
. saya menggores data dari web menggunakan python, kemudian membuat file CSV dengan data yang tergores, yang kemudian saya proses dengan file PHP di server saya yang mengunggah data ke database saya. semua tabel / kolom MySQL saya disusun sebagaiutf8mb4_unicode_ci
. mungkin masalah ini muncul karena saya menyandikan data sepertiutf8
di python / csv?Saya menghabiskan setengah hari mencari jawaban untuk kesalahan identik "Campuran ilegal dari koleksi" dengan konflik antara utf8_unicode_ci dan utf8_general_ci.
Saya menemukan bahwa beberapa kolom dalam basis data saya tidak secara khusus disusun utf8_unicode_ci . Tampaknya mysql secara implisit menyusun kolom-kolom ini utf8_general_ci .
Secara khusus, menjalankan kueri 'SHOW CREATE TABLE table1' menghasilkan sesuatu seperti berikut:
Perhatikan baris 'col1' varchar (4) SET CHARACTER utf8 NOT NULL tidak memiliki collation yang ditentukan. Saya kemudian menjalankan kueri berikut:
ALTER TABLE table1 CHANGE col1 col1 VARCHAR(4) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
Ini menyelesaikan kesalahan "Campuran ilegal dari koleksi saya". Semoga ini bisa membantu orang lain di luar sana.
sumber
COLLATE
untuk seluruh tabel (yaituALTER TABLE table1 CHARSET utf8 COLLATE utf8_unicode_ci
) tidak akan memperbaiki masalah , itu harus dilakukan untuk setiap kolom (bermasalah).Saya memiliki masalah yang sama, tetapi terpikir oleh saya di dalam prosedur, ketika param kueri saya diatur menggunakan variabel misalnya
SET @value='foo'
.Apa yang menyebabkan ini tidak cocok
collation_connection
dan pengumpulan Database. Diubahcollation_connection
untuk mencocokkancollation_database
dan masalah hilang. Saya pikir ini pendekatan yang lebih elegan daripada menambahkan COLLATE setelah param / value.Singkatnya: semua koleksi harus cocok. Gunakan
SHOW VARIABLES
dan pastikancollation_connection
dancollation_database
cocokkan (juga periksa susunan tabel menggunakanSHOW TABLE STATUS [table_name]
).sumber
SET @my_var = 'string1,string2' COLLATE utf8_unicode_ci;
Agak mirip dengan jawaban @bpile, kasus saya adalah pengaturan entri my.cnf
collation-server = utf8_general_ci
. Setelah saya menyadarinya (dan setelah mencoba semuanya di atas), saya dengan paksa mengganti database saya ke utf8_general_ci alih-alih utf8_unicode_ci dan hanya itu:sumber
Dalam kasus saya sendiri, saya memiliki kesalahan berikut
Campuran ilegal dari koleksi (utf8_general_ci, IMPLICIT) dan (utf8_unicode_ci, IMPLICIT) untuk operasi '='
Setelah berminggu-minggu pencarian google, saya perhatikan bahwa dua bidang yang saya bandingkan terdiri dari nama collation yang berbeda. Yang pertama yaitu nama pengguna adalah utf8_general_ci sedangkan yang kedua adalah utf8_unicode_ci jadi saya kembali ke struktur tabel kedua dan mengubah bidang kedua (matric_no) menjadi utf8_general_ci dan itu bekerja seperti pesona.
sumber
Meskipun menemukan sejumlah besar pertanyaan tentang masalah yang sama ( 1 , 2 , 3 , 4 ) saya belum pernah menemukan jawaban yang mempertimbangkan kinerja, bahkan di sini.
Meskipun beberapa solusi kerja telah diberikan, saya ingin melakukan pertimbangan kinerja.
EDIT: Terima kasih kepada Manatax untuk menunjukkan bahwa opsi 1 tidak mengalami masalah kinerja.
Menggunakan Opsi
1 dan2 , alias pendekatan COLLATE cast, dapat menyebabkan potensi kemacetan, karena indeks apa pun yang ditentukan pada kolom tidak akan digunakan menyebabkan pemindaian penuh .Meskipun saya tidak mencoba Opsi 3 , dugaan saya adalah ia akan mengalami konsekuensi yang sama dari opsi
1 dan2.Terakhir, Opsi 4 adalah opsi terbaik untuk tabel yang sangat besar bila memungkinkan. Maksud saya tidak ada penggunaan lain yang mengandalkan pemeriksaan asli.
Pertimbangkan permintaan yang disederhanakan ini:
Dalam contoh asli saya, saya memiliki lebih banyak bergabung. Tentu saja, table1 dan table2 memiliki susunan yang berbeda. Menggunakan operator susun untuk dilemparkan, itu akan menyebabkan indeks tidak digunakan.
Lihat penjelasan sql pada gambar di bawah ini.
Penjelasan Kueri Visual saat menggunakan cast COLLATE
Di sisi lain, opsi 4 dapat mengambil keuntungan dari kemungkinan indeks dan menyebabkan pertanyaan cepat.
Pada gambar di bawah ini, Anda dapat melihat kueri yang sama dijalankan setelah diterapkan Opsi 4 , alias mengubah susunan skema / tabel / kolom.
Penjelasan Kueri Visual setelah collation telah diubah, dan karenanya tanpa collate cast
Kesimpulannya, jika kinerja penting dan Anda dapat mengubah susunan tabel, pilih Opsi 4 . Jika Anda harus bertindak pada satu kolom, Anda dapat menggunakan sesuatu seperti ini:
sumber
Ini terjadi ketika kolom secara eksplisit diatur ke susunan berbeda atau susunan default berbeda dalam tabel yang ditanyakan.
jika Anda memiliki banyak tabel yang ingin Anda ubah susunan saat menjalankan kueri ini:
ini akan menampilkan permintaan yang diperlukan untuk mengonversi semua tabel untuk menggunakan susunan yang benar per kolom
sumber