Akar masalah terletak di sini:
Saya menggunakan SQLite3 untuk pengembangan dan PostgreSQL untuk penerapan.
Itu ide yang buruk™. Anda akan terus mengalami ketidaksesuaian - atau lebih buruk:tidak menyadari beberapa sampai kerusakan terjadi.
Gunakan RDBMS (PostgreSQL) yang sama untuk pengembangan dan produksi dan selamatkan diri Anda dari masalah yang tidak berguna.
Saat Anda terjebak dengan penyiapan yang tidak menguntungkan, ada perbaikan sederhana :
lower(style) LIKE lower(?)
Bekerja di kedua platform sama.
-
Anda dapat meletakkan
lower()
. sebelah kanan , jika Anda memberikan pola penelusuran huruf kecil. -
Dalam SQLite standar
lower(X)
hanya melipat huruf ASCII. Untuk lebih lanjut, saya mengutip bab Fungsi Inti dalam manual SQLite:Fungsi lower(X) mengembalikan salinan string X dengan semua karakter ASCII dikonversi ke huruf kecil. Fungsi bawaan bawaan lebih rendah () hanya berfungsi untuk karakter ASCII. Untuk melakukan konversi huruf besar-kecil pada karakter non-ASCII, muat ekstensi ICU .
Tekankan milikku.
-
PostgreSQL
lower(X)
bekerja dengan UTF-8 di luar kotak.
Sebagai efek samping sambutan, Anda dapat mempercepat tingkatkan kueri itu di PostgreSQL dengan indeks pada ekspresi lower(style)
, yang akan lebih cepat daripada menggunakan ILIKE
dan indeks dasar pada style
.
Selain itu, sejak PostgreSQL 9.1 Anda dapat menggunakan indeks GIN atau GIST dengan pg_trgm
ekstensi untuk mempercepat apa saja LIKE
dan ILIKE
query - trigram tidak peka huruf besar/kecil. Instruksi terperinci dan tautan dalam jawaban terkait ini:
- String UTF-8 serupa untuk bidang pelengkapan otomatis