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šembin
PostgreSQL adresář (ale i kdyžUPPER
aLOWER
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
- hledejte......
- ...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 obaLC_CTYPE
aLC_COLLATE
) otevřetepostgres.exe
v 32bitový Dependency Walker a ujistěte se, že ukazuje, že načítáMSVCR100.DLL
zbin
PostgreSQL adresář. - pokud všechny funkce dobře zkopírují opravenou knihovnu DLL do produkčního
bin
PostgreSQL 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.