PostgreSQL警告:控制台代码页(437)与Windows代码页(1252)不同。

52

当我在 PostgreSQL 数据库 SQL 提示符中使用 \c testdb 连接到数据库时,我成功地连接到了该数据库,但是收到以下警告:

postgres-# \c testdb
WARNING: Console code page (437) differs from Windows code page (1252)
         8-bit characters might not work correctly. See psql reference
         page "Notes for Windows users" for details.
You are now connected to database "testdb" as user "postgres".
testdb-#

这个警告表示什么?如何解决它?


@jww,你能在这里发布一下stackoverflow、super user和database admins的准则链接吗? - Cale Sweeney
18个回答

52

根据psql文档

psql是作为“控制台应用程序”构建的。由于Windows控制台窗口使用不同的编码方式,因此在psql中使用8位字符时必须特别小心。如果psql检测到有问题的控制台代码页,它将在启动时发出警告。

要更改控制台代码页,需要两件事情:输入cmd.exe /c chcp 1252设置代码页。(1252是适用于德语的代码页;请将其替换为您的值。)如果您使用Cygwin,则可以将此命令放入/ etc/profile。

因此,为了消除该警告,您需要在输入psql之前执行chcp 1252。使用无参数的chcp可获取当前代码页。


我遇到了同样的问题。我尝试执行1252代码,但错误仍然存在。在您的解决方案中,您提到了要做两件事情,但只描述了其中一件。请问您能否解释第二个要做的事情? - Abhishek
第二件事是什么? - Woodchuck
我认为这是警告中提到的“Windows用户注意事项”:https://www.postgresql.org/docs/current/static/app-psql.html(页面底部)。 - Woodchuck
3
在我的机器上,需要将chcp 1252添加到位于“C:\Program Files\PostgreSQL\12\scripts\runpsql.bat”的psql批处理文件中,这可以帮助使内容更加易懂。 - Hutch Moore
1
这个帮助我在Windows上更广泛地进行了更改,尽管有人报告了一些程序问题。https://superuser.com/a/1435645/1064813 - Petri Ryhänen
显示剩余2条评论

26

CMD.exe的默认代码页与postgres的默认代码页不同。要使用REGISTRY更改CMD.exe的代码页,请尝试以下操作:

  1. 开始 -> 运行 -> regedit
  2. 转到[HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor]
  3. 添加名为“Autorun”的新字符串值,其值为“chcp 1252”

然后重新打开CMD.exe即可。


4
我知道这已经超过两年了,但是因为它没有被采纳的答案,所以我想说这对我有用。 - Engels Leonhardt
即使我使用直接安装在Postgres上的psql命令行工具(因为我不将其放入路径中,而且我更喜欢这种方式),它仍然可以正常工作。它会改变我从该工具运行的提示符的代码页。 - Ola
与Postgres一起使用所需的编码取决于数据库编码,如果它与全局设置的控制台代码页(cmd.exe / Command Prompt)不同,则需要在运行Postgres的特定命令提示符的代码页中进行设置。可以通过此方法设置全局代码页。 - Ola

13
为了让它更加明显,@user3423801要添加该行的文件。
cmd.exe /c chcp 1252

该文件位于您安装PostgreSQL时的 scripts 目录中。

例如,在我的情况下,它是这样的:

C:\Program Files\PostgreSQL\9.3\scripts\runpsql.bat

2
这对我不起作用。当我通过批处理文件打开终端时,它可以工作。但是当我使用 sql 时,警告仍然会弹出。 - user2361174

8

打开cmd.exe并运行regedit

转到计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor

新建一个字符串值,命名为:Autorun,并将其值更改为chcp 1252

完成。

参考:https://dev59.com/l2s05IYBdhLWcg3wIObS#30100565


7
请不要假设 Unix 的解决方法适用于 Windows 用户。对于 Windows 10 和 PostgreSQL 12,结合 "user3423801" 和 "numbers longer" 的答案适用于我。(Windows 注册表修改无效。我还没有尝试重新启动.) 最好在 PSQL 启动脚本中修复它。
文件位置 C:\Program Files\PostgreSQL\12\scripts 包含文件runpsql.bat,您必须将 cmd.exe /c chcp 1252 command插入到正确的位置。因此,您编辑的文件顶部应如下所示的 5 或 6 行。
@echo off

REM Copyright (c) 2012-2014, EnterpriseDB Corporation.  All rights reserved

REM PostgreSQL server psql runner script for Windows

cmd.exe /c chcp 1252

SET server=localhost
SET /P server="Server [%server%]: "

4

或者,您可以在命令提示符窗口中直接键入cmd.exe /c chcp 1252


如果OP需要的是1252代码页,则所需的编码取决于数据库编码。更通用的utf-8编码65001的代码页编号。 - Ola

4
的回答是正确的,但加上代码示例会更明显。
@echo off

REM Copyright (c) 2012-2014, EnterpriseDB Corporation.  All rights reserved

REM PostgreSQL server psql runner script for Windows

cmd.exe /c chcp 1252

SET server=localhost
SET /P server="Server [%server%]: "

3

只需打开PowerShell或cmd.exe并键入命令chcp 1252,或者输入页面所需的页码 "即Windows代码页"。如果问题仍然存在,只需打开控制台属性“通过单击控制台窗口左上角的PowerShell图标并从下拉菜单中选择属性”并将字体更改为“Lucida Console”。这对我有效,但您必须以管理员身份打开PowerShell。


2
上面的答案都还可以,但没有提到Windows 1252编码适用于英语版本的Windows和其他西欧语言。这为那些可能会对德语编码产生困惑的人提供了完整的答案。是的,它适用于没有德语、西班牙语、法语、意大利语、罗马尼亚语、匈牙利语等需要特殊字符的英语。https://en.m.wikipedia.org/wiki/Windows-1252 Windows 1252编码是什么?Windows-1252或CP-1252(代码页1252)是拉丁字母的单字节字符编码,由Microsoft Windows的旧版组件默认使用于英语和其他一些西方语言(其他语言使用不同的默认编码)。

1

对于Postgres 11

"警告:控制台代码页(437)与Windows代码页(1252)不同,8位字符可能无法正常工作。有关详细信息,请参见psql参考页面“Windows用户注意事项”。

如果您不是计算机管理员,请在postgres安装的基本目录中找到pg_env.bat脚本并添加一行"chcp 1252"。 即"C:\Program Files\PostgreSQL\11"

如果您是计算机管理员,则可以修改注册表以每次运行“cmd.exe”时运行上述行,如上所述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接