Masalah Anda adalah 100% Windows. (Atau lebih tepatnya Microsoft Visual Studio, yang digunakan untuk membangun PostgreSQL, lebih tepatnya.)
Sebagai catatan, SQL UPPER akhirnya memanggil LCMapStringW Windows
(melalui towupper
melalui str_toupper
) dengan hampir semua parameter yang tepat (lokal 1055 Turki untuk UTF-8 -dikodekan, Turkish_Turkey basis data),
tetapi
Visual Studio Runtime (towupper ) tidak menyetel LCMAP_LINGUISTIC_CASING
sedikit di LCMapStringW dwMapFlags . (Saya dapat mengonfirmasi bahwa pengaturan itu berhasil.) Ini tidak dianggap sebagai bug di Microsoft; itu dirancang, dan mungkin tidak akan pernah "diperbaiki" (oh nikmatnya warisan.)
Anda memiliki tiga jalan keluar dari ini:
- terapkan solusi pembungkus @Sorrow (atau tulis pengganti fungsi asli (DLL) Anda sendiri).
- jalankan instance PostgreSQL Anda di mis. Ubuntu yang menunjukkan perilaku yang tepat untuk lokal Turki (@Sorrow menegaskan bahwa itu bekerja untuknya); ini mungkin jalan keluar yang paling sederhana dan paling bersih.
- masukkan
MSVCR100.DLL32-bit yang telah ditambal dibinPostgreSQL Anda direktori (tetapi meskipunUPPERdanLOWERakan bekerja, hal-hal lain seperti pemeriksaan dapat terus gagal -- sekali lagi, pada tingkat Windows. YMMV.)
Untuk kelengkapan (dan kesenangan nostalgia) HANYA , berikut adalah prosedur untuk menambal sistem Windows (tetapi ingat, kecuali Anda akan mengelola instance PostgreSQL ini dari awal hingga akhir, Anda dapat menyebabkan banyak kesedihan bagi penerus Anda); setiap kali menerapkan pengujian baru atau sistem cadangan dari menggaruk Anda atau penerus Anda harus ingat untuk menerapkan tambalan lagi -- dan jika katakanlah suatu hari Anda meningkatkan ke PostgreSQL 10, yang mengatakan menggunakan MSVCR120.DLL bukannya MSVCR100.DLL , maka Anda harus mencoba keberuntungan Anda dengan menambal DLL baru juga.) Pada sistem pengujian
- gunakan HxD
untuk membuka
C:\WINDOWS\SYSTEM32\MSVCR100.DLL - simpan DLL segera dengan nama yang sama di bawah PostgreSQL Anda
bindirektori (jangan mencoba menyalin file menggunakan Explorer atau baris perintah, mereka mungkin menyalin versi 64bit) - dengan file yang masih terbuka dalam format HxD, buka Search> Replace , pilih Tipe data:Nilai Hex , lalu
- cari......
4E 14 33 DB 3B CB 0F 84 41 12 00 00 B8 00 01 00 00 - ganti dengan...
4E 14 33 DB 3B CB 0F 84 41 12 00 00 B8 00 01 00 01 - ...lalu sekali lagi...
- cari......
FC 51 6A 01 8D 4D 08 51 68 00 02 00 00 50 E8 E2 - ganti dengan...
FC 51 6A 01 8D 4D 08 51 68 00 02 00 01 50 E8 E2
- cari......
- ...dan simpan kembali di bawah
binPostgreSQL direktori, lalu mulai ulang PostgreSQL dan jalankan kembali kueri Anda.- jika kueri Anda masih tidak berfungsi (pastikan basis data Anda dikodekan dengan UTF-8
Turkish_Turkeyuntuk keduanyaLC_CTYPEdanLC_COLLATE) bukapostgres.exedi Pejalan Ketergantungan 32-bit dan pastikan itu menunjukkan itu memuatMSVCR100.DLLdaribinPostgreSQL direktori. - jika semua fungsi dengan baik salin DLL yang ditambal ke
binPostgreSQL produksi direktori dan mulai ulang.
- jika kueri Anda masih tidak berfungsi (pastikan basis data Anda dikodekan dengan UTF-8
TAPI INGAT, saat Anda memindahkan data dari sistem Ubuntu atau dari sistem Windows yang ditambal ke sistem Windows yang tidak ditambal, Anda akan memiliki masalah lagi, dan Anda mungkin tidak dapat mengimpor data ini kembali di Ubuntu jika instance Windows memperkenalkan duplikat di sebuah citext atau dalam UPPER /LOWER -indeks fungsi berbasis.