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?
mysql
sql
mysql-error-1267
Klik Suka
sumber
sumber
Jawaban:
lalu untuk database Anda
MySQL menyelinap ke Swedia kadang-kadang tanpa alasan yang masuk akal.
sumber
Anda harus menyetel encoding tabel dan encoding koneksi ke
UTF-8
:dan
sumber
myDb
DEFAULT CHARACTER SET utf8 COLLATE utf8_bin. Apakah itu akan berhasil? Ini dilakukan sehingga akan mempengaruhi semua tabel saya, tidak hanya satu dari merekaMemecahkan masalah saya. Di mana kolom1 adalah kolom yang memberi saya kesalahan ini.
sumber
Gunakan pernyataan berikut untuk kesalahan
hati-hati tentang data Anda, ambil cadangan jika data ada di tabel.
sumber
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: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.sumber
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):sumber
Ubah kumpulan karakter tabel menjadi utf8
sumber
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:
Sumber: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
sumber
Saya menemukan bahwa menggunakan
cast()
adalah solusi terbaik untuk saya:Ada juga
convert()
fungsinya. Detail lebih lanjut di siniSumber daya lain di sini
sumber
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:
sumber