Perintah dan konteks
Sistem harus menemukan nama pengguna atau email dari input pengguna menggunakan Unicode Default Caseless Matching. Jelaskan bagaimana Anda akan mengevaluasi casefold() PostgreSQL 18, memilih collation, membangun indeks, dan memigrasikan data yang ada. Jangan berhenti hanya pada satu panggilan fungsi.
Apa yang dievaluasi pewawancara
- Mengetahui bahwa case folding berbeda dari lowercasing sederhana dan dapat memperluas satu karakter menjadi beberapa karakter.
- Memeriksa UTF-8, penyedia collation, dan batasan khusus penerapan.
- Menjelaskan indeks ekspresi, keunikan, normalisasi, dan urutan migrasi.
- Merancang deteksi konflik, rollback, validasi performa, dan aturan yang ditampilkan kepada pengguna.
Pertanyaan klarifikasi yang perlu diajukan
- Apakah persyaratannya adalah Unicode default caseless matching atau aturan pengurutan khusus lokalitas?
- Apakah ini untuk pencarian, pencocokan login, atau keunikan global setelah normalisasi?
- Bisakah data yang ada mengandung ß, huruf Yunani, atau karakter penggabung? Bolehkah nilai tampilan berubah?
- Apa pengodean database, penyedia collation, versi, dan jendela perubahan indeks online?
Kerangka jawaban 30 detik
Saya akan mengonfirmasi semantik pencocokan dan keunikan, kemudian memverifikasi UTF-8 serta collation yang mendukung case folding. casefold() harus menghasilkan kunci perbandingan, bukan menggantikan nilai tampilan; beberapa karakter dapat memanjang, dan penyedia libc mungkin berperilaku seperti lower(). Saya akan membuat kunci secara offline dan menemukan konflik sebelum membuat indeks ekspresi atau batasan unik kunci tersimpan, lalu memigrasikan pembacaan dan penulisan secara bertahap sambil memantau rencana kueri. Sampel multibahasa yang representatif, penggunaan indeks, perubahan panjang, dan rollback harus diuji sebelum peluncuran.
Penyelaman mendalam langkah demi langkah
1. Tentukan batasan pencocokan dan tampilan
Simpan nilai asli secara terpisah dari kunci perbandingan. Tentukan apakah normalisasi Unicode, penghapusan spasi kosong, atau aturan khusus email juga diperlukan; casefold hanya menangani case folding.
2. Verifikasi pengodean dan collation
Dokumentasi mensyaratkan pengodean server UTF-8. Case folding bergantung pada collation: collation Unicode dapat melipat ß menjadi ss, sedangkan penyedia libc tanpa dukungan case-folding membuat casefold setara dengan lower. Jalankan sampel representatif di lingkungan target sebelum penerapan.
3. Rancang indeks dan keunikan
Pencarian dapat menggunakan indeks ekspresi pada casefold(column). Untuk keunikan, putuskan apakah kunci perbandingan disimpan (persisted) dan bagaimana konflik historis diselesaikan. Jangan berasumsi panjang hasil tidak berubah atau membiarkan kolom tampilan memaksakan identitas.
4. Migrasi dan validasi dengan aman
Pindai baris yang ada untuk mencari kunci terlipat yang sama, tentukan aturan penggabungan atau resolusi manual, lalu lakukan backfill dan tambahkan batasan secara bertahap. Validasi dengan EXPLAIN, sampel multibahasa yang mirip produksi, penulisan bersamaan (concurrent writes), dan percobaan ulang; jeda pengalihan (cutover) dan pertahankan tombol rollback jika muncul konflik.
Jawaban model
Saya akan memperlakukan casefold() sebagai aturan kunci perbandingan, bukan transformasi tampilan. Saya akan mengonfirmasi Unicode Default Caseless Matching, pengodean UTF-8, dan perilaku collation target untuk karakter seperti ß, lalu memeriksa penyedia karena folding libc yang tidak didukung akan kembali ke lower(). Saya akan memindai baris yang ada untuk konflik kunci terlipat, memilih kunci tersimpan atau indeks ekspresi, dan membuat batasan keunikan yang sesuai. Migrasi akan melakukan backfill dan dual-write secara bertahap, dengan pengujian rencana kueri, konkurensi, multibahasa, dan rollback. Pengguna akan melihat nilai asli sementara aturan pencocokan tetap eksplisit.
Kesalahan umum
- Memperlakukan
casefold()sebagai alias sederhana untuklower(). - Mengabaikan perbedaan UTF-8, collation, dan penyedia.
- Mengasumsikan output terlipat mempertahankan panjang yang sama dan memotongnya.
- Menambahkan batasan unik sebelum memindai konflik historis.
- Menimpa nilai tampilan dengan kunci perbandingan.
- Hanya menguji fungsionalitas dan bukan rencana indeks ekspresi pada data multibahasa.
Pertanyaan lanjutan dan tanggapan
Bisakah casefold menggantikan normalisasi?
Tidak. Ini hanya menangani case folding; karakter penggabung, karakter kompatibilitas, dan pembersihan bisnis memerlukan aturan normalisasi terpisah yang urutannya harus diuji.
Mengapa ß menjadi kasus uji yang berguna?
Dengan collation seperti PG_UNICODE_FAST, ß dapat dilipat menjadi ss. Perubahan panjang tersebut langsung mengungkap asumsi desain pada pencocokan, ukuran kolom, dan keunikan.
Risiko apa yang diperkenalkan oleh penyedia libc?
Dokumentasi menyatakan bahwa tanpa dukungan case-folding, libc membuat casefold setara dengan lower. Kunci collation/penyedia dan jalankan uji migrasi serta regresi di lingkungan yang menyerupai produksi.