Re: PostgreSQL Windows Installer defaults to "English_United States.1252" when choosing locale starting with "English"
Thomas Munro <thomas.munro@gmail.com>
From: Thomas Munro <thomas.munro@gmail.com>
To: Sandeep Thakkar <sandeep.thakkar@enterprisedb.com>
Cc: Ben Caspi <benc@aidoc.com>, pgsql-bugs@lists.postgresql.org, Liran Amrani <lirana@aidoc.com>, Avi Uziel <avi.uziel@aidoc.com>,
Shahar Amram <shahara@aidoc.com>
Date: 2025-07-10T01:54:03Z
Lists: pgsql-bugs
On Thu, Jul 10, 2025 at 12:41 AM Sandeep Thakkar
<sandeep.thakkar@enterprisedb.com> wrote:
> Yes, you are correct. I got the same result. But it was correct when I chose the BCP-47 name like en-uk. Probably something to do with how initdb is handling the long names.
What's the exact initdb command in this case? I'm a bit confused
about ""English, United Kingdom" vs "English_United Kingdom.1252". I
think maybe the Windows C library is doing this, because that first
form isn't really a supported form, and it only manages to grok the
first word with some best-match scheme? I don't have Windows but I
just pushed a stupid test program to CI to test that theory:
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
const char *or_null(const char *s)
{
return s == NULL ? "<null>" : s;
}
int
main(int argc, char *argv[])
{
if (setlocale(LC_ALL, "English, United Kingdom") == NULL)
printf("error 1\n");
printf("got: %s\n", or_null(setlocale(LC_ALL, NULL)));
if (setlocale(LC_ALL, "English_United Kingdom") == NULL)
printf("error 2\n");
printf("got: %s\n", or_null(setlocale(LC_ALL, NULL)));
if (setlocale(LC_ALL, "English_United Kingdom.1252") == NULL)
printf("error 3\n");
printf("got: %s\n", or_null(setlocale(LC_ALL, NULL)));
return EXIT_SUCCESS;
}
And lo and behold it printed:
got: English_United States.1252
got: English_United Kingdom.1252
got: English_United Kingdom.1252
Apparently it really needs that underscore.