sql >> Databáze >  >> RDS >> PostgreSQL

Horní funkce Postgres na tureckém znaku nevrací očekávaný výsledek

Váš problém je 100% Windows. (Nebo spíše Microsoft Visual Studio, se kterým byl PostgreSQL postaven, abych byl přesnější.)

Pro záznam, SQL UPPER skončí voláním systému Windows LCMapStringW (přes towupper přes str_toupper ) s téměř všechny správné parametry (místní nastavení 1055 turečtina pro UTF-8 -encoded, Turkish_Turkey databáze),

ale

runtime sady Visual Studio (towupper ) nenastavuje LCMAP_LINGUISTIC_CASING bit v LCMapStringW dwMapFlags uživatele . (Mohu potvrdit, že nastavením se to vyřeší.) Toto není ve společnosti Microsoft považováno za chybu; je to záměrné a pravděpodobně nikdy nebude „opraveno“ (och radost z dědictví.)

Máte tři způsoby, jak z toho ven:

  • implementujte řešení wrapper společnosti @Sorrow (nebo napište vlastní náhradu nativní funkce (DLL).)
  • spusťte svou instanci PostgreSQL např. Ubuntu který vykazuje správné chování pro turkická prostředí (@Sorrow potvrdil, že mu to funguje); toto je pravděpodobně nejjednodušší a nejčistší cesta ven.
  • vložte opravenou 32bitovou knihovnu MSVCR100.DLL ve vašem bin PostgreSQL adresář (ale i když UPPER a LOWER by fungovalo, další věci, jako je řazení, mohou nadále selhávat -- opět na úrovni Windows. YMMV.)

Pro úplnost (a nostalgická zábava) POUZE , zde je postup pro záplatu systému Windows (ale pamatujte, že pokud nebudete tuto instanci PostgreSQL spravovat od kolébky do hrobu, můžete svým nástupcům způsobit spoustu zármutku; kdykoli nasadíte nový testovací nebo záložní systém z scratch vy nebo vaši nástupci (následníci) by si museli pamatovat, že je třeba opravu znovu aplikovat -- a pokud řekněme, že jednoho dne upgradujete na PostgreSQL 10, který říká, že používá MSVCR120.DLL místo MSVCR100.DLL , pak budete muset zkusit své štěstí také s opravou nové knihovny DLL.) Na testovacím systému

  • použijte HxD otevřete C:\WINDOWS\SYSTEM32\MSVCR100.DLL
  • okamžitě uložte DLL se stejným názvem pod bin PostgreSQL adresář (nepokoušejte se kopírovat soubor pomocí Průzkumníka nebo příkazového řádku, mohou zkopírovat 64bitovou verzi)
  • se souborem stále otevřeným v HxD přejděte na Hledat> Nahradit , vyberte Datový typ:Hexvalues , pak
    • hledejte...... 4E 14 33 DB 3B CB 0F 84 41 12 00 00 B8 00 01 00 00
    • nahradit za... 4E 14 33 DB 3B CB 0F 84 41 12 00 00 B8 00 01 00 01
    • ...tak ještě jednou...
    • hledejte...... FC 51 6A 01 8D 4D 08 51 68 00 02 00 00 50 E8 E2
    • nahradit za... FC 51 6A 01 8D 4D 08 51 68 00 02 00 01 50 E8 E2
  • ...a znovu uložte do bin PostgreSQL adresář, poté restartujte PostgreSQL a znovu spusťte dotaz.
    • pokud váš dotaz stále nefunguje (ujistěte se, že vaše databáze má kódování UTF-8 pomocí Turkish_Turkey pro oba LC_CTYPE a LC_COLLATE ) otevřete postgres.exe v 32bitový Dependency Walker a ujistěte se, že ukazuje, že načítá MSVCR100.DLL z bin PostgreSQL adresář.
    • pokud všechny funkce dobře zkopírují opravenou knihovnu DLL do produkčního bin PostgreSQL adresář a restartujte.

ALE PAMATUJTE, že v okamžiku, kdy přesunete data ze systému Ubuntu nebo z opraveného systému Windows do neopraveného systému Windows, budete mít problém znovu a možná nebudete moci importovat tato data zpět do Ubuntu, pokud instance Windows zavedla duplikáty v citext pole nebo v UPPER /LOWER -založený funkční index.



  1. Django anotuje počet v JSONField s Postgres

  2. Doporučený způsob importu souboru .csv do Microsoft SQL Server 2008 R2?

  3. MySQL procházet tabulky

  4. MySql - Jak vybrat rozsah id v nastavených intervalech