Masalah:

Katakanlah tabel customers (id, name, email, .. ) dikodekan menggunakan utf-8 (utf8_general_ci collation).

Tabel ini juga memiliki batasan kunci unik pada kolom email.

Saat mencoba mengubah susunan ke utf8mb4 menggunakan ALTER TABLE customers CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;, beberapa entri menyebabkan batasan indeks unik menyala, karena dianggap duplikat.

Contoh:

row1: (1, "strauss" "strauss@email.com")
row2: (10, "Strauss" "strauß@email.com")

Hal yang sama terjadi jika dua email hanya berbeda dengan karakter spasi nol lebar.

Diuji dengan mysql versi 5.7.20

0
mihaic 7 Juli 2020, 12:27

1 menjawab

Jawaban Terbaik

Dalam bahasa Jerman, ß pada dasarnya dianggap sama dengan ss.

Meskipun susunan xxx_unicode_ci menghormati itu, xxx_general_ci tidak, jadi Anda beralih dari susunan yang menganggap "straus@email.com" tidak sama dengan "strauß@email.com" ke yang tidak .

Sebenarnya, xxx_general_ci memperlakukan ß dan s sama, jadi ia akan mengeluh tentang "straus@email.com" dan "strauß@email.com" sebagai gantinya.

Lihat dokumentasi:

_general_ci Versus _unicode_ci Kolasi

Untuk kumpulan karakter Unicode apa pun, operasi yang dilakukan menggunakan susunan xxx_general_ci lebih cepat daripada operasi untuk susunan xxx_unicode_ci. Misalnya, perbandingan untuk susunan utf8_general_ci lebih cepat, tetapi sedikit kurang benar, daripada perbandingan untuk utf8_unicode_ci. Alasannya adalah utf8_unicode_ci mendukung pemetaan seperti ekspansi; yaitu, ketika satu karakter dibandingkan dengan kombinasi karakter lainnya. Misalnya, sama dengan ss dalam bahasa Jerman dan beberapa bahasa lainnya. utf8_unicode_ci juga mendukung kontraksi dan karakter yang dapat diabaikan. utf8_general_ci adalah kumpulan warisan yang tidak mendukung ekspansi, kontraksi, atau karakter yang dapat diabaikan. Itu hanya dapat membuat perbandingan satu-ke-satu antara karakter.

0
Solarflare 7 Juli 2020, 10:20