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.DLL
32-bit yang telah ditambal dibin
PostgreSQL Anda direktori (tetapi meskipunUPPER
danLOWER
akan 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
bin
direktori (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
bin
PostgreSQL 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_Turkey
untuk keduanyaLC_CTYPE
danLC_COLLATE
) bukapostgres.exe
di Pejalan Ketergantungan 32-bit dan pastikan itu menunjukkan itu memuatMSVCR100.DLL
daribin
PostgreSQL direktori. - jika semua fungsi dengan baik salin DLL yang ditambal ke
bin
PostgreSQL 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.