Re: PostgreSQL Windows Installer defaults to "English_United States.1252" when choosing locale starting with "English"

From: Thomas Munro <thomas(dot)munro(at)gmail(dot)com>
To: Sandeep Thakkar <sandeep(dot)thakkar(at)enterprisedb(dot)com>
Cc: Ben Caspi <benc(at)aidoc(dot)com>, pgsql-bugs(at)lists(dot)postgresql(dot)org, Liran Amrani <lirana(at)aidoc(dot)com>, Avi Uziel <avi(dot)uziel(at)aidoc(dot)com>, Shahar Amram <shahara(at)aidoc(dot)com>
Subject: Re: PostgreSQL Windows Installer defaults to "English_United States.1252" when choosing locale starting with "English"
Date: 2025-07-10 01:54:03
Message-ID: CA+hUKGKcfWRyr2nJTmUtL-hN2bHD4-JU-gooxqGGKdyu4hbk_g@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

On Thu, Jul 10, 2025 at 12:41 AM Sandeep Thakkar
<sandeep(dot)thakkar(at)enterprisedb(dot)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.

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message Amit Kapila 2025-07-10 03:27:17 Re: Unexpected behavior when setting "idle_replication_slot_timeout"
Previous Message Tom Lane 2025-07-09 18:25:55 Re: BUG #18983: Problems with Postgres "make check" under ASAN