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.DLLve vašembinPostgreSQL adresář (ale i kdyžUPPERaLOWERby 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
binPostgreSQL 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
- hledejte......
- ...a znovu uložte do
binPostgreSQL 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_Turkeypro obaLC_CTYPEaLC_COLLATE) otevřetepostgres.exev 32bitový Dependency Walker a ujistěte se, že ukazuje, že načítáMSVCR100.DLLzbinPostgreSQL adresář. - pokud všechny funkce dobře zkopírují opravenou knihovnu DLL do produkčního
binPostgreSQL adresář a restartujte.
- pokud váš dotaz stále nefunguje (ujistěte se, že vaše databáze má kódování UTF-8 pomocí
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.