Memecahkan masalah kesalahan "Campuran pengumpulan ilegal" di mysql

220

Saya mendapatkan kesalahan di bawah ini ketika mencoba melakukan pemilihan melalui prosedur tersimpan di MySQL.

Campuran collation ilegal (latin1_general_cs, IMPLICIT) dan (latin1_general_ci, IMPLICIT) untuk operasi '='

Ada gagasan tentang apa yang mungkin salah di sini?

Susunan tabel adalah latin1_general_cidan kolom di klausa where berada latin1_general_cs.

pengguna355562
sumber
2
Saya telah menggunakan berbagai database untuk waktu yang lama (sejak 1990), dan penggunaan collation dan coercibiity yang dibuat oleh NySQL tampak sebagai "gila", database memecahkan masalah yang memaksakan set karakter "SATU" untuk database, lalu terserah prosedur impor / ekspor untuk mengubah dari / ke set karakter unik yang digunakan oleh database. Solusi yang dipilih Mysql adalah salah satu yang mengganggu, karena mencampur "masalah aplikasi" (konversi set karakter) dengan masalah database (penggunaan pemeriksaan). Mengapa tidak "menghapus" fitur konyol dan rumit itu dari database sehingga menjadi lebih dapat digunakan dan dikendalikan oleh
Maurizio Pievaioli

Jawaban:

222

Hal ini umumnya disebabkan oleh perbandingan dua string pemeriksaan yang tidak kompatibel atau dengan mencoba memilih data pemeriksaan berbeda ke dalam kolom gabungan.

Klausa COLLATEmemungkinkan Anda menentukan pemeriksaan yang digunakan dalam kueri.

Misalnya, WHEREklausul berikut akan selalu memberikan kesalahan yang Anda posting:

WHERE 'A' COLLATE latin1_general_ci = 'A' COLLATE latin1_general_cs

Solusi Anda adalah menentukan pemeriksaan bersama untuk dua kolom dalam kueri. Berikut adalah contoh yang menggunakan COLLATEklausa:

SELECT * FROM table ORDER BY key COLLATE latin1_general_ci;

Opsi lainnya adalah menggunakan BINARYoperator:

BINARY str adalah singkatan dari CAST (str AS BINARY).

Solusi Anda mungkin terlihat seperti ini:

SELECT * FROM table WHERE BINARY a = BINARY b;

atau,

SELECT * FROM table ORDER BY BINARY a;
mendefinisikan
sumber
3
Terima kasih. Sebenarnya tampaknya bersikap sangat aneh dalam kasusku. Saat saya menjalankan kueri sebagaimana adanya, melalui browser kueri, saya mendapatkan hasilnya. Tetapi menggunakan prosedur tersimpan memunculkan kesalahan.
pengguna355562
6
Biner sepertinya menjadi solusi terbaik bagi saya. Ini mungkin yang terbaik untuk Anda juga jika Anda tidak menggunakan filter yang rumit.
Adam F
Saya memiliki masalah yang sama, cara saya mengatasi masalah ini dibuat ulang dari awal. Saya mencoba mengubah pemeriksaan tetapi ketika saya bergabung masih mendapat kesalahan, jadi saya mencoba cara itu. cmiiw
Bobby Z
Harap dicatat bahwa ada bug dalam penggunaan MariaDB COLLATE latin1_general_ci yang menyebabkan kesalahan lain: COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1''- meskipun Anda tidak memiliki kolom dengan SET KARAKTER 'latin1'! Solusinya adalah dengan menggunakan cast BINARY. Lihat juga pertanyaan ini
Mel_T
161

TL; DR

Ubah susunan salah satu (atau keduanya) string sehingga cocok, atau tambahkan COLLATEklausa ke ekspresi Anda.


  1. Apa sih "collation" ini?

    Seperti yang didokumentasikan di bawah Kumpulan Karakter dan Kolasi secara Umum :

    Sebuah set karakter adalah seperangkat simbol dan pengkodean. SEBUAH pemeriksaan adalah seperangkat aturan untuk membandingkan karakter dalam set karakter. Mari kita perjelas perbedaannya dengan contoh himpunan karakter imajiner.

    Misalkan kita memiliki alfabet dengan empat huruf: “ A”, “ B”, “ a”, “ b”. Kami memberi setiap huruf angka: “ A” = 0, “ B” = 1, “ a” = 2, “ b” = 3. Huruf “ A” adalah simbol, angka 0 adalah pengkodean untuk “ A”, dan kombinasi dari semua empat huruf dan penyandiannya adalah a set karakter .

    Misalkan kita ingin membandingkan dua nilai string, " A" dan " B". Cara termudah untuk melakukannya adalah dengan melihat pengkodean: 0 untuk " A" dan 1 untuk " B". Karena 0 lebih kecil dari 1, kita mengatakan " A" lebih kecil dari " B". Apa yang baru saja kita lakukan adalah menerapkan pemeriksaan ke kumpulan karakter kita. Penyusunan adalah sekumpulan aturan (hanya satu aturan dalam kasus ini): "bandingkan pengkodean." Kami menyebutnya pemeriksaan sederhana dari semua kemungkinan pemeriksaan sebagai pemeriksaan biner .

    Tetapi bagaimana jika kita ingin mengatakan bahwa huruf kecil dan huruf besar sama? Kemudian kita akan memiliki setidaknya dua aturan: (1) memperlakukan huruf kecil " a" dan " b" sama dengan " A" dan " B"; (2) lalu bandingkan pengkodeannya. Kami menyebutnya pemeriksaan case-insensitive . Ini sedikit lebih kompleks daripada pemeriksaan biner.

    Dalam kehidupan nyata, sebagian besar rangkaian karakter memiliki banyak karakter: tidak hanya " A" dan " B" tetapi seluruh huruf, terkadang beberapa huruf atau sistem penulisan timur dengan ribuan karakter, bersama dengan banyak simbol khusus dan tanda baca. Juga dalam kehidupan nyata, kebanyakan collations memiliki banyak aturan, tidak hanya untuk membedakan huruf besar, tapi juga untuk membedakan aksen ("aksen" adalah tanda yang dilampirkan ke karakter seperti dalam bahasa Jerman " Ö"), dan untuk banyak karakter pemetaan (seperti aturan yang “ Ö” = “ OE” di salah satu dari dua collation Jerman).

    Contoh lebih lanjut diberikan di bawah Contoh Pengaruh Penyusunan .

  2. Oke, tapi bagaimana MySQL memutuskan pemeriksaan mana yang akan digunakan untuk ekspresi tertentu?

    Seperti yang didokumentasikan di bawah Collation of Expressions :

    Di sebagian besar pernyataan, jelas pemeriksaan apa yang digunakan MySQL untuk menyelesaikan operasi perbandingan. Misalnya, dalam kasus berikut ini, harus jelas bahwa pemeriksaan adalah pemeriksaan kolom charset_name:

    SELECT x FROM T ORDER BY x;
    SELECT x FROM T WHERE x = x;
    SELECT DISTINCT x FROM T;
    

    Namun, dengan beberapa operan, bisa jadi ada ambiguitas. Sebagai contoh:

    SELECT x FROM T WHERE x = 'Y';
    

    Haruskah perbandingan menggunakan susunan kolom x, atau string literal 'Y'? Keduanya xdan 'Y'memiliki susunan, jadi pemeriksaan mana yang diutamakan?

    SQL standar menyelesaikan pertanyaan semacam itu menggunakan apa yang dulu disebut aturan "koersibilitas".

    [ deletia ]

    MySQL menggunakan nilai koersibilitas dengan aturan berikut untuk menyelesaikan ambiguitas:

    • Gunakan susunan dengan nilai koersibilitas terendah.

    • Jika kedua belah pihak memiliki koersibilitas yang sama, maka:

      • Jika kedua sisi adalah Unicode, atau kedua sisi bukan Unicode, itu adalah kesalahan.

      • Jika salah satu sisi memiliki himpunan karakter Unicode, dan sisi lain memiliki himpunan karakter non-Unicode, sisi dengan himpunan karakter Unicode menang, dan konversi himpunan karakter otomatis diterapkan ke sisi non-Unicode. Misalnya, pernyataan berikut tidak mengembalikan kesalahan:

        SELECT CONCAT(utf8_column, latin1_column) FROM t1;
        

        Ini mengembalikan hasil yang memiliki kumpulan karakter utf8dan pemeriksaan yang sama seperti utf8_column. Nilai latin1_columnsecara otomatis dikonversi menjadi utf8sebelum penggabungan.

      • Untuk operasi dengan operan dari kumpulan karakter yang sama tetapi yang menggabungkan _binpemeriksaan dan pemeriksaan _ciatau _cspemeriksaan, _binpemeriksaan digunakan. Ini mirip dengan bagaimana operasi yang mencampur string nonbiner dan biner mengevaluasi operan sebagai string biner, kecuali untuk collation daripada tipe data.

  3. Jadi, apa yang dimaksud dengan "pemeriksaan campuran ilegal"?

    Sebuah "gabungan pengumpulan ilegal" terjadi ketika sebuah ekspresi membandingkan dua string dari kumpulan yang berbeda tetapi memiliki pemaksaan yang sama dan aturan pemaksaan tidak dapat membantu menyelesaikan konflik. Ini adalah situasi yang dijelaskan di bawah poin ketiga dalam kutipan di atas.

    Kesalahan khusus yang diberikan dalam pertanyaan,, Illegal mix of collations (latin1_general_cs,IMPLICIT) and (latin1_general_ci,IMPLICIT) for operation '='memberi tahu kita bahwa ada perbandingan kesetaraan antara dua string non-Unicode dengan koersibilitas yang sama. Lebih jauh lagi, ini memberi tahu kita bahwa collations tidak diberikan secara eksplisit dalam pernyataan tetapi tersirat dari sumber string (seperti metadata kolom).

  4. Itu semua sangat baik, tetapi bagaimana cara mengatasi kesalahan seperti itu?

    Seperti yang disarankan oleh ekstrak manual yang dikutip di atas, masalah ini dapat diselesaikan dengan beberapa cara, di mana dua di antaranya masuk akal dan direkomendasikan:

    • Ubah susunan salah satu (atau keduanya) string sehingga cocok dan tidak ada lagi ambiguitas.

      Bagaimana ini bisa dilakukan tergantung dari mana string itu berasal: Ekspresi literal mengambil pemeriksaan yang ditentukan dalam collation_connectionvariabel sistem; nilai dari tabel mengambil pemeriksaan yang ditentukan dalam metadata kolomnya.

    • Paksa satu string agar tidak dapat dipaksakan.

      Saya menghilangkan kutipan berikut dari atas:

      MySQL memberikan nilai koersibilitas sebagai berikut:

      • COLLATEKlausa eksplisit memiliki koersibilitas 0. (Sama sekali tidak bisa dipaksakan.)

      • Rangkaian dua string dengan susunan berbeda memiliki koersibilitas 1.

      • Pengumpulan kolom atau parameter rutin yang disimpan atau variabel lokal memiliki koersibilitas 2.

      • Sebuah "konstanta sistem" (string yang dikembalikan oleh fungsi seperti USER()atau VERSION()) memiliki koersibilitas 3.

      • Penyusunan literal memiliki koersibilitas 4.

      • NULLatau ungkapan yang diturunkan dari NULLmemiliki koersibilitas 5.

      Jadi, menambahkan COLLATEklausa ke salah satu string yang digunakan dalam perbandingan akan memaksa penggunaan susunan itu.

    Sementara yang lain akan menjadi praktik yang sangat buruk jika mereka dikerahkan hanya untuk mengatasi kesalahan ini:

    • Paksa salah satu (atau keduanya) string untuk memiliki nilai koersibilitas lain sehingga salah satunya diutamakan.

      Penggunaan CONCAT()atau CONCAT_WS()akan menghasilkan string dengan koersibilitas 1; dan (jika dalam rutinitas tersimpan) penggunaan parameter / variabel lokal akan menghasilkan string dengan koersibilitas 2.

    • Ubah pengkodean salah satu (atau keduanya) string sehingga yang satu adalah Unicode dan yang lainnya bukan.

      Ini dapat dilakukan melalui transcoding dengan ; atau melalui mengubah set karakter yang mendasari data (misalnya memodifikasi kolom, mengubah nilai literal, atau mengirimnya dari klien dalam pengkodean yang berbeda dan mengubah / menambahkan pengenal set karakter). Perhatikan bahwa mengubah pengkodean akan menimbulkan masalah lain jika beberapa karakter yang diinginkan tidak dapat dikodekan dalam kumpulan karakter baru.CONVERT(expr USING transcoding_name)character_set_connectioncharacter_set_client

    • Ubah pengkodean salah satu (atau keduanya) string sehingga keduanya sama dan ubah satu string untuk menggunakan _binpemeriksaan yang relevan .

      Metode untuk mengubah pengkodean dan penyusunan telah dirinci di atas. Pendekatan ini tidak akan banyak berguna jika seseorang benar-benar perlu menerapkan aturan pemeriksaan yang lebih canggih daripada yang ditawarkan oleh _binpemeriksaan.

telur
sumber
4
Perhatikan bahwa "campuran pengumpulan ilegal" juga dapat muncul jika tidak ada ambiguitas tentang pemeriksaan mana yang harus digunakan, tetapi string yang akan dipaksakan harus ditranskode ke pengkodean yang beberapa karakternya tidak dapat diwakili. Saya telah membahas kasus ini dalam jawaban sebelumnya .
eggyal
5
Jawaban yang bagus. Yang ini harus lebih maju, karena menyelami apa yang seharusnya diketahui pengembang; tidak hanya bagaimana memperbaikinya, tetapi benar-benar memahami mengapa hal-hal terjadi dengan cara yang terjadi.
tandai
Terima kasih bung, Anda mengajari saya sesuatu hari ini.
briankip
68

Menambahkan 2c saya ke diskusi untuk calon karyawan Google.

Saya sedang menyelidiki masalah serupa di mana saya mendapatkan kesalahan berikut saat menggunakan fungsi khusus yang menerima parameter varchar:

Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and 
(utf8_general_ci,IMPLICIT) for operation '='

Menggunakan kueri berikut:

mysql> show variables like "collation_database";
    +--------------------+-----------------+
    | Variable_name      | Value           |
    +--------------------+-----------------+
    | collation_database | utf8_general_ci |
    +--------------------+-----------------+

Saya dapat mengetahui bahwa DB menggunakan utf8_general_ci , sedangkan tabelnya ditentukan menggunakan utf8_unicode_ci :

mysql> show table status;
    +--------------+-----------------+
    | Name         | Collation       |
    +--------------+-----------------+
    | my_view      | NULL            |
    | my_table     | utf8_unicode_ci |
    ...

Perhatikan bahwa pandangan memiliki pemeriksaan NULL . Tampaknya tampilan dan fungsi memiliki definisi pemeriksaan meskipun kueri ini menunjukkan null untuk satu tampilan. Pemeriksaan yang digunakan adalah pemeriksaan DB yang ditentukan saat tampilan / fungsi dibuat.

Solusi yang menyedihkan adalah mengubah pemeriksaan db dan membuat ulang tampilan / fungsi untuk memaksa mereka menggunakan pemeriksaan saat ini.

  • Mengubah pemeriksaan db:

    ALTER DATABASE mydb DEFAULT COLLATE utf8_unicode_ci;
    
  • Mengubah susunan tabel:

    ALTER TABLE mydb CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

Saya harap ini akan membantu seseorang.

Ariel T
sumber
13
Kolasi juga dapat diatur di tingkat kolom. Anda dapat melihatnya dengan:show full columns from my_table;
Jonathan Tran
Terima kasih. Saya baru saja menjatuhkan skema, dan membuatnya kembali dengan pemeriksaan default yang benar, dan mengimpor ulang semuanya.
JRun
1
@JonathanTran Terima kasih! Saya memiliki set karakter dan kumpulan pada semua tabel, database, dan koneksi, tetapi masih memberikan kesalahan! Susunannya tidak diatur pada kolom! Saya memperbaikinya denganalter table <TABLE> modify column <COL> varchar(255) collate utf8_general_ci;
Chloe
2
Sidenote untuk karyawan Google di masa mendatang: Meskipun database, tabel, dan bidang Anda semuanya memiliki pemeriksaan yang sama, Anda juga harus memastikan bahwa koneksi Anda menggunakan pemeriksaan yang sama. Semuanya memiliki »utf8mb4_unicode_ci« tetapi SHOW session variables like '%collation%';memberitahu Anda bahwa »collation_connection« adalah »utf8mb4_general_ci«? Lalu lari SET collation_connection = utf8mb4_unicode_cidulu.
pixelbrackets
Terima kasih! Butuh beberapa saat untuk melacak ini. Tidak hanya tabel harus susunan yang sama, tetapi DB juga!
moto
15

Terkadang berbahaya untuk mengonversi rangkaian karakter, khususnya pada database dengan data dalam jumlah besar. Menurut saya, opsi terbaik adalah menggunakan operator "biner":

e.g : WHERE binary table1.column1 = binary table2.column1
Justin Vincent
sumber
11

Saya memiliki masalah yang sama, mencoba menggunakan prosedur FIND_IN_SET dengan variabel string .

SET @my_var = 'string1,string2';
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);

dan menerima kesalahan

Kode Kesalahan: 1267. Campuran collation ilegal (utf8_unicode_ci, IMPLICIT) dan (utf8_general_ci, IMPLICIT) untuk operasi 'find_in_set'

Jawaban singkat:

Tidak perlu mengubah variabel collation_YYYY, cukup tambahkan pemeriksaan yang benar di sebelah deklarasi variabel Anda , yaitu

SET @my_var = 'string1,string2' COLLATE utf8_unicode_ci;
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);

Jawaban panjang:

Saya pertama kali memeriksa variabel pemeriksaan:

mysql> SHOW VARIABLES LIKE 'collation%';
    +----------------------+-----------------+
    | Variable_name        | Value           |
    +----------------------+-----------------+
    | collation_connection | utf8_general_ci |
    +----------------------+-----------------+
    | collation_database   | utf8_general_ci |
    +----------------------+-----------------+
    | collation_server     | utf8_general_ci |
    +----------------------+-----------------+

Lalu saya memeriksa susunan tabel:

mysql> SHOW CREATE TABLE my_table;

CREATE TABLE `my_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `column_name` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=125 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Ini berarti variabel saya dikonfigurasi dengan pemeriksaan default utf8_general_ci sementara tabel saya dikonfigurasi sebagai utf8_unicode_ci .

Dengan menambahkan perintah COLLATE di sebelah deklarasi variabel, pemeriksaan variabel cocok dengan pemeriksaan yang dikonfigurasi untuk tabel.

nkatsar
sumber
5

Anda dapat mencoba skrip ini , yang mengonversi semua database dan tabel Anda ke utf8.

Mirat Can Bayrak
sumber
1
baris 24 "cur" bukannya "cursor"
RTOSkit
2
Dan tiga kali lipat ukuran beberapa indeks.
Damian Yerrick
2

Solusi jika literal terlibat.

Saya menggunakan Pentaho Data Integration dan tidak bisa menentukan sintaks sql. Menggunakan pencarian DB yang sangat sederhana memberikan kesalahan "Gabungan pengumpulan ilegal (cp850_general_ci, COERCIBLE) dan (latin1_swedish_ci, COERCIBLE) untuk operasi '='"

Kode yang dihasilkan adalah "PILIH DATA_DATE AS latest_DATA_DATE FROM hr_cc_normalised_data_date_v WHERE PSEUDO_KEY =?"

Singkat cerita, pencarian adalah untuk melihat dan ketika saya mengeluarkan

mysql> show full columns from hr_cc_normalised_data_date_v;
+------------+------------+-------------------+------+-----+
| Field      | Type       | Collation         | Null | Key |
+------------+------------+-------------------+------+-----+
| PSEUDO_KEY | varchar(1) | cp850_general_ci  | NO   |     |
| DATA_DATE  | varchar(8) | latin1_general_cs | YES  |     |
+------------+------------+-------------------+------+-----+

yang menjelaskan dari mana 'cp850_general_ci' berasal.

Tampilan hanya dibuat dengan 'PILIH' X ', ......' Menurut literal manual seperti ini harus mewarisi kumpulan karakter dan pemeriksaan dari pengaturan server yang didefinisikan dengan benar sebagai 'latin1' dan 'latin1_general_cs' seperti ini jelas tidak terjadi saya memaksakannya dalam pembuatan tampilan

CREATE OR REPLACE VIEW hr_cc_normalised_data_date_v AS
SELECT convert('X' using latin1) COLLATE latin1_general_cs        AS PSEUDO_KEY
    ,  DATA_DATE
FROM HR_COSTCENTRE_NORMALISED_mV
LIMIT 1;

sekarang ini menunjukkan latin1_general_cs untuk kedua kolom dan kesalahan telah hilang. :)

jc508.dll
sumber
1

MySQL benar-benar tidak menyukai kumpulan campuran kecuali jika dapat memaksa mereka ke yang sama (yang jelas tidak dapat dilakukan dalam kasus Anda). Tidak bisakah Anda memaksa pemeriksaan yang sama untuk digunakan melalui klausa COLLATE ? (atau BINARYpintasan yang lebih sederhana jika ada ...).

Alex Martelli
sumber
Apakah ini unik untuk MySQL? Bagaimana sistem lain menangani campuran kumpulan yang tidak kompatibel dengan prioritas yang tampaknya sama?
eggyal
Tautan Anda tidak valid.
Benubird
1

Jika kolom yang bermasalah adalah "hash", pertimbangkan hal berikut ...

Jika "hash" adalah string biner, Anda harus benar-benar menggunakan BINARY(...)tipe data.

Jika "hash" adalah string hex, Anda tidak perlu utf8, dan harus menghindarinya karena pemeriksaan karakter, dll. Misalnya, MySQL MD5(...)menghasilkan string hex 32-byte dengan panjang tetap. SHA1(...)memberikan string hex 40-byte. Ini bisa disimpan ke dalam CHAR(32) CHARACTER SET ascii(atau 40 untuk sha1).

Atau, lebih baik lagi, simpan UNHEX(MD5(...))ke BINARY(16). Ini memotong setengah ukuran kolom. (Namun, itu membuatnya agak tidak bisa dicetak.) SELECT HEX(hash) ... Jika Anda ingin itu dapat dibaca.

Membandingkan dua BINARYkolom tidak memiliki masalah pemeriksaan.

Rick James
sumber
1

Sangat menarik ... Sekarang, bersiaplah. Saya melihat semua solusi "tambahkan susunan" dan bagi saya, itu adalah perbaikan bantuan pita. Kenyataannya adalah desain database itu "buruk". Ya, perubahan standar dan hal-hal baru ditambahkan, bla bla, tetapi itu tidak mengubah fakta desain database yang buruk. Saya menolak untuk menggunakan rute menambahkan "collate" di seluruh pernyataan SQL hanya untuk membuat kueri saya berfungsi. Satu-satunya solusi yang berhasil untuk saya dan secara virtual menghilangkan kebutuhan untuk mengubah kode saya di masa depan adalah mendesain ulang database / tabel agar sesuai dengan kumpulan karakter yang akan saya jalani dan rangkul untuk masa depan jangka panjang. Dalam hal ini, saya memilih untuk menggunakan set karakter " utf8mb4 ".

Jadi solusi di sini ketika Anda menemukan pesan kesalahan "ilegal" adalah mendesain ulang database dan tabel Anda. Jauh lebih mudah dan lebih cepat daripada kedengarannya. Mengekspor data Anda dan mengimpornya kembali dari CSV mungkin tidak diperlukan. Ubah kumpulan karakter database dan pastikan semua kumpulan karakter tabel Anda cocok.

Gunakan perintah ini untuk memandu Anda:

SHOW VARIABLES LIKE "collation_database";
SHOW TABLE STATUS;

Sekarang, jika Anda menikmati menambahkan "collate" di sana-sini dan memperkuat kode Anda dengan force fulls "overrides", tebaklah.

Nya Nguyen
sumber
1

Solusi di bawah ini berhasil untuk saya.

CONVERT( Table1.FromColumn USING utf8)    =  CONVERT(Table2.ToColumn USING utf8) 
menyolok
sumber
0

Salah satu sumber masalah pemeriksaan adalah mysql.proctabel. Periksa susunan prosedur dan fungsi penyimpanan Anda:

SELECT
  p.db, p.db_collation, p.type, COUNT(*) cnt
FROM mysql.proc p
GROUP BY p.db, p.db_collation, p.type;

Perhatikan juga kolom mysql.proc.collation_connectiondan mysql.proc.character_set_client.

ruvim
sumber
-1

Saya menggunakan ALTER DATABASE mydb DEFAULT COLLATE utf8_unicode_ci;, tetapi tidak berhasil.

Dalam kueri ini:

Select * from table1, table2 where table1.field = date_format(table2.field,'%H');

Ini bekerja untuk saya:

Select * from table1, table2 where concat(table1.field) = date_format(table2.field,'%H');

Ya, hanya a concat.

Knito Auron
sumber
Periksa susunan tabel Anda dan kolomnya (tampilkan status tabel; dan tampilkan kolom lengkap dari table1;). Menggunakan database alter tidak akan berfungsi jika tabel sudah dibuat dengan pemeriksaan yang salah.
Ariel T
ALTER DATABASE mydb DEFAULT COLLATE ... berhasil untuk saya, jadi upvote. Mungkin saya mendapat keuntungan karena saya dapat melepaskan dan membuat ulang database dan memuat dari cadangan.
tobixen
-2

Kode ini perlu dimasukkan ke dalam Jalankan kueri / kueri SQL di database

SQL QUERY WINDOW

ALTER TABLE `table_name` CHANGE `column_name` `column_name`   VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL;

Harap ganti nama_tabel dan nama_kolom dengan nama yang sesuai.

Sukumar
sumber