PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Fungsi atas Postgres pada karakter Turki tidak mengembalikan hasil yang diharapkan

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 di bin PostgreSQL Anda direktori (tetapi meskipun UPPER dan LOWER 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
  • ...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 keduanya LC_CTYPE dan LC_COLLATE ) buka postgres.exe di Pejalan Ketergantungan 32-bit dan pastikan itu menunjukkan itu memuat MSVCR100.DLL dari bin PostgreSQL direktori.
    • jika semua fungsi dengan baik salin DLL yang ditambal ke bin PostgreSQL produksi direktori dan mulai ulang.

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Melindungi Database PostgreSQL Anda dari Serangan Cyber ​​dengan SQL Firewall

  2. Perlu dua indeks pada tabel gabungan HABTM?

  3. Filter baris berdasarkan nilai di dalam beberapa kolom JSONB

  4. PostgreSQL:Menghubungkan ke instance Postgres dari jarak jauh menggunakan perintah psql

  5. Tidak dapat bermigrasi di Heroku