如果这些问题无法解决,邮件列表可能会有帮助。
关于 PostgreSQL 的 ODBC 接口的讨论。
此文档的最新版本可以在 https://odbc.postgresql.ac.cn/faq.html 查看。
您可以发送邮件到 [email protected]。
可能不需要。如果您使用的是 Windows,您真正需要做的就是下载并运行完整版。
安装驱动程序最简单的方法是获取完整发行版。只需下载、解压缩并运行安装程序。安装是一个标准的 Windows 安装程序包,它将引导您完成整个过程。对于将来的升级,可以使用 MSI 发行版。它要小得多,因为它不包含 Windows 安装程序可再发行组件,您只需要安装一次。第二个选择是自己编译驱动程序。如果您在 Unix 平台上使用此驱动程序,目前这是您唯一的选项。
psqlODBC 可执行文件是在 32 位 Wintel 平台上编写和编译的。这包括 Windows 95、98、ME、NT、2000 和 XP。16 位应用程序能够使用 32 位驱动程序,但仅限于这些平台。
我们不为 Unix 分发二进制文件。但是,源代码已移植到 Unix 下编译。Unix 有两个驱动程序管理器可用,UnixODBC 和 iODBC。
这个!这是官方 PostgreSQL ODBC 驱动程序。
您可以发送邮件到 [email protected],但是,您应该附加以下内容
但是,在发布之前,请确保您正在运行最新版本的 psqlODBC。
对于 Windows,请使用控制面板中的 ODBC 管理员(在某些版本中,它可能位于“管理工具”文件夹中)。在这里,您可以添加、修改或删除数据源。
系统 DSN 和用户 DSN 仅在系统上谁可以访问它们方面有所不同。但是,文件 DSN 并不是真正的数据源。它是一个包含用于直接连接到 ODBC 驱动程序的所有连接参数的文件。
首先,选择您要配置的收藏夹数据源。然后在“PostgreSQL 驱动程序设置”对话框中,在“选项(高级)”下选择“驱动程序”按钮或“数据源”按钮。这将弹出一个包含您可以配置的选项的另一个对话框。有关所有这些选项的信息,请参阅配置帮助。
ODBC 驱动程序有一个选项可以将所有直接通信(查询、更新等)以及错误消息和通知记录到 commlog 文件中。此外,它现在还将所有 ODBC 连接和语句错误记录到此文件中,并提供详细的信息。这对于那些在出现问题时提供误导性、很少或没有描述性信息的应用程序来说非常有用(VisData 就是一个很好的例子)。
PostgreSQL Unicode 是一个支持 Unicode 的驱动程序,它可以与 Microsoft Access 等现代应用程序一起使用,支持来自各种语言的字符。您应该将此驱动程序与编码为 'UNICODE'(在 PostgreSQL 中更准确地称为 'UTF-8')的 PostgreSQL 数据库一起使用。
PostgreSQL ANSI 是一个 ANSI 驱动程序,它也可以处理一些多字节字符集,例如 EUC_JP、BIG5 和 Shift-JIS。此驱动程序也应该与使用任何 LATIN 字符集编码的数据库一起使用。
请注意,某些应用程序(特别是 Borland BDE)无法与 Unicode ODBC 驱动程序正常工作。在这种情况下,您必须使用 ANSI 驱动程序。
此消息来自 PostgreSQL 后端,很可能是由于 ODBC 驱动程序和后端之间存在协议不匹配。例如,如果您使用 PostgreSQL 6.2 作为后端,并尝试使用 ODBC 驱动程序而没有正确设置协议,则会发生此错误。您必须在 ODBC 驱动程序配置对话框中检查“6.2 协议”高级数据源选项。
注意:如果您现在仍在运行 6.x 版本,您真的、真的、真的应该尽快升级到 8.x 版本!
请验证您尝试连接到的数据库是否存在,并且您有权访问它。此外,请参阅上面关于用户名和密码身份验证的问题。
ODBC 连接清单
是的。psqlODBC 支持“md5”加密登录,但不支持“crypt”登录。请记住,登录后,ODBC 会以明文形式发送所有查询,因此您只保护了密码。此外,对 md5 登录的支持是在 2001 年后期添加的,因此如果您使用的是旧版本的 psqlODBC,则可能需要更新它。
注意:从 08.01.002 版本开始,psqlODBC 现在支持 SSL 加密连接。
您可能正在使用 **PostgreSQL Unicode** 驱动程序与非 Unicode、8 位数据(例如,来自 LATIN 编码之一)一起使用。您应该使用 **PostgreSQL ANSI** 驱动程序,或者将您的数据移动到 Unicode 数据库。
驱动程序完全支持所有 PostgreSQL 标准数据类型。这些是:bool、int2、int4、int8、float4、float8、date、time、abstime、datetime、timestamp、char、varchar 和 text。
对所有其他数据类型提供部分支持。这些示例:point、circle、box 和数组。字符串支持仅提供给这些非标准类型。换句话说,它们将作为 SQL_VARCHAR 返回,并且可以像任何其他数据类型一样显示和更新。结果行为可能会因每个应用程序和数据类型而异。
在 int4[] 和 MS Access 97 的情况下,它可以有效地完成工作。数组可以干净地显示和更新。算术有点棘手。MS Access 在查询构建器中抱怨“t.a[1]”。它不喜欢语法,永远不会将其发送到后端。解决方法是选择 SQL 直通选项。这将允许您构建类似“t.a[0] * t.a[1]”的表达式。麻烦的是,每次您在 Access 97 中运行查询时,它都会提示您使用数据库连接对话框。
MS Excel 与 MS Query 结合使用可能提供更好的解决方案。它会通过每个查询。如果我知道要将它们公开,我会尽量避免使用更奇特的类型。
某些版本的 PostgreSQL 缺少一些运算符(有人记得是哪些版本吗?),因此为了使用行版本控制,您必须重载 int4eq 函数以用于 xid 类型。此外,您还需要创建一个运算符来比较 xid 和 int4。您必须对每个要使用此功能的数据库执行此操作。这在 PostgreSQL 6.4 中可能不再需要,因为它将被添加。以下是详细信息。
create function int4eq(xid,int4) returns bool as '' language 'internal'; create operator = ( leftarg=xid, rightarg=int4, procedure=int4eq, commutator='=', negator='<>', restrict=eqsel, join=eqjoinsel );
大对象在驱动程序中映射到 LONGVARBINARY,以便允许在 Microsoft Access 中存储诸如 OLE 对象之类的东西。通常使用多个 SQLPutData 和 SQLGetData 调用来发送和检索这些对象。驱动程序创建一个新的对象,并将它的“标识符”插入到相应的表中。但是,由于 PostgreSQL 使用“Oid”来标识大对象,因此有必要创建一个新的 PostgreSQL 类型,以便能够区分普通 Oid 和大对象 Oid。在该新类型成为 PostgreSQL 的正式部分之前,必须将其添加到所需的数据库中,并在每次连接时进行查找。驱动程序中使用的类型简单地称为“lo”,以下是用于创建它的命令。
create type lo ( internallength=4, externallength=10, input=int4in, output=int4out, default='', passedbyvalue ); create table employee ( id integer, name varchar(30), picture lo );
完成此操作后,只需使用新的“lo”类型来定义该数据库中的列即可。当驱动程序看到“lo”类型时,它将将其处理为 SQL_LONGVARBINARY。
另一个重要的注意事项是,这种新类型缺乏功能。它不会在更新和删除后自行清理,从而导致孤儿对象存在并占用额外的磁盘空间。目前,PostgreSQL 不支持对大对象的清理。
编写一个临时的独立清理过程,以便在服务器上以一定间隔运行,并不太难。只需在 pg_attribute 中搜索 lo 数据类型列,并通过查询包含 lo 的每个表来构建一个 lo 列表。然后将此列表与 pg_class 中的 xinv.* 进行比较。没有指针的 xinv.* 是孤儿对象,应该被删除。
希望将来,真正的对象数据类型将作为基本类型提供。但目前,将 Word 文档、Visio 文档或跳舞婴儿的 AVI 存储到数据库列中确实很有趣,即使您最终会填满服务器的硬盘!
Jet 数据库引擎(Access 使用)和其他引擎可以使用“键集”来访问记录。根据键中部分的数量,性能可能从缓慢到后端崩溃不等。以下是一个使用 10 行(典型的键集数量)的键集查询
-- This is a 3 part key select ... from foo where (v1 = "?" AND v2 = "?" AND v3 ="?") OR -- line 1 (v1 = "?" AND v2 = "?" AND v3 ="?") OR -- line 2 ... (v1 = "?" AND v2 = "?" AND v3 ="?") OR -- line 9 (v1 = "?" AND v2 = "?" AND v3 ="?") -- line 10
问号将被键值替换
在 PostgreSQL 6.4 之前,这是一个主要问题。但截至 6.4,至少有 2 个修复程序可以解决此问题。其中一个修复程序称为 KSQO(键集查询优化)。从 6.4 开始,驱动程序现在默认情况下启用此功能,尽管可以在高级驱动程序选项设置中更改此功能。
SQLPrimaryKeys() 在驱动程序中实现。驱动程序查询系统表以查找名为“{table}_pkey”的唯一索引。例如
create table foo ( id integer primary key, data varchar(20) );
如果使用 Borland,请考虑设置以下高级驱动程序选项
使用 6.4 协议时,此问题应该不会出现。
在 PostgreSQL 6.4 协议之前,后端不会在查询结果中返回 varchar/char 数据类型的尺寸,而 Borland 严重依赖此功能来进行简单查询和数据字典导入。因此,开发了几个驱动程序选项来帮助解决此问题。
目前,如果启用了解析语句选项,解析器将回退到执行语句,如果它无法处理特定列。因此,最好将未知大小也设置为“最长”。
一些聚合函数,如 sum(int4) 和 avg(int4),使用数值数据类型返回结果。根据 SQL 规范,这是完全合法的,这样做是为了防止溢出和其他问题,但不幸的是,微软的 ActiveX 数据对象似乎不喜欢它。有两种解决方法
可以在查询属性中指定数据源,这样它就不会每次都询问你。在视图菜单下,选择属性。对于“ODBC 连接字符串”属性,在“ODBC;”之后添加“DSN=<你的数据源名称>”。你也可以添加其他属性,例如“ODBC;DSN=my_dsn;UID=me;PWD=test”。
此消息来自 PostgreSQL 后端。PostgreSQL 目前要求 ORDER BY 和 GROUP BY 子句中的字段包含在目标列表中。但是,此限制已在 PostgreSQL 6.4+ 中解除。
Access 所基于的旧版 Microsoft Jet 数据库引擎存在一些问题,会导致这种情况。即使你没有对任何内容进行排序,Access 也会坚持在联接查询中添加一个 order by 子句。即使使用 PostgreSQL 6.4+,查询可能不再出错,但它会以你可能不希望的方式排序,并且无法更改它。要解决此问题,你需要将 Jet 数据库引擎更新到 3.51 版。它可以从微软免费获得。点击 这里 从微软支持网站下载最新的 Jet 引擎。
由 Michael Zedeler ([email protected]) 贡献
如果你收到以下消息:“写入冲突 - 此记录自您开始编辑以来已被其他用户更改。[...]”来自 Access 2000,这很可能是由于 Access 和 PostgreSQL 之间的标准不同而产生的问题。
从旧时起,根据一些 SQL 标准,空字符串被定义为等于 NULL。这种规定多年来引发了许多问题,因此 PostgreSQL 为了纠正这种情况,偏离了标准。在 PostgreSQL 中,NULL 就是 NULL,空字符串就是空字符串。
因此,当 Access 从 PostgreSQL 中检索包含空字符串的字段的行时,它会自动将它们转换为 NULL 值。当您尝试更新此行时,从 Access 2000 发送到 PostgreSQL 的查询将无法更新该行。以下是一个例子:
您已将以下行插入到表 a 中:
id | name----+------------------------- 1 | <- contains the empty string. Not NULL.
然后,您使用 Access 2000 检索该行,随后在 "name" 字段中插入值 "Smartypants"。
您可能期望 Access 2000 向 PostgreSQL 发送以下查询:
UPDATE a SET name = 'Smartypants' WHERE id = 1 AND name = ''
(添加 "AND name = ''" 是为了避免在其他用户已经更新了该行的情况下进行更新。)
但 Access 2000 实际发送的是:
UPDATE a SET name = 'Smartypants' WHERE id = 1 AND name IS NULL
该查询失败,因为 PostgreSQL 没有将 NULL 视为空字符串。
如何解决问题
我还没有找到任何解决方法,只能停止在字符字段中使用空字符串。
这个问题只会在其他系统将数据插入 PostgreSQL 表时出现,因此您必须让这些系统在必要时开始使用 NULL 而不是空字符串。当 Access 2000 插入数据时,它将始终将空字符串转换为 NULL,从而保持与(旧的?)SQL 标准一致的数据。
PostgreSQL 7.2 及更高版本可能会导致类似的问题,但原因不同
由 Sam Hokin ([email protected]) 贡献
新的 PostgreSQL 时间戳数据类型默认使用微秒精度。这意味着时间戳值存储为 2002-05-22 09:00:00.123456-05 的形式。但是,Access 不支持额外的精度,因此 Access 使用的值为 2002-05-22 09:00:00-05。当尝试更新记录时,会收到上述错误消息,因为 Access 在其 UPDATE 查询中使用的值与 PostgreSQL 表中的值不匹配,类似于本 FAQ 条目中已报告的 NULL 与空字符串冲突。
如何解决问题
简单的解决方法是使用 timestamp(0) 而不是 timestamp。否则,必须确保所有插入 PostgreSQL 表的时间戳值都具有零小数秒值。
顺便说一下,这个问题在 Access 97 和 Access 2000 中都会出现。
由史蒂文·西特龙-普斯蒂 ([email protected]) 贡献
解决 access2k 和 7.2 中提到的问题的另一种方法是使用一个查询,该查询在您的数据视图后面,并排除时间戳列。在我们的案例中,时间戳是自动生成的,所以我们甚至不需要看到它们。因此,如果您不需要编辑时间戳值,请通过创建不包含数据值的查询来隐藏该列。
文本字段默认映射到 SQL_LONGVARCHAR。因此,MS Access 将这些列视为“备忘录”类型。好消息是,您可以在文本列中存储高达 PostgreSQL 块大小限制的数据。PostgreSQL 在 7.1 版本之前有一个不到 8k 的元组限制,其中包括一个名为 TOAST 的新功能,该功能允许存储更大的字符串。
您可以通过取消选中数据类型选项下的高级驱动程序选项“文本作为 LongVarchar”来更改文本字段到 SQL_VARCHAR 的映射。这应该允许使用文本字段,但您将受到 varchar 最大大小的限制。
文本字段默认映射到 SQL_LONGVARCHAR。因此,MS Access 将这些列视为“备忘录”类型。好消息是,您可以在文本列中存储高达 PostgreSQL 块大小限制的数据。PostgreSQL 在 7.1 版本之前有一个不到 8k 的元组限制,其中包括一个名为 TOAST 的新功能,该功能允许存储更大的字符串。
您可以通过取消选中数据类型选项下的高级驱动程序选项“文本作为 LongVarchar”来更改文本字段到 SQL_VARCHAR 的映射。这应该允许使用文本字段。
如果您使用数字或 int8 (bigint) 列作为主键,则通常会出现这种情况。在 Access 中,Int 是一个 16 位值,Long Int 是一个 32 位值,这与 PostgreSQL 不同,在 PostgreSQL 中,int 是一个 32 位值,bigint 是一个 64 位值。Access 将 int8/numeric 键视为浮点值,它无法用作键。要解决此问题,如果您需要数字主键,请坚持使用 int4。有关更多信息,请参阅 Microsoft KB 文章 #128809。
由马克·伍德 ([email protected]) 贡献
虽然您可以像往常一样在 Win X64 上安装 32 位 ODBC 驱动程序,但您无法通过普通的控制面板或 ODBC 数据源管理员配置 32 位 DSN。
如何在 Win x64 上配置 32 位 ODBC 驱动程序
从 **%SystemRoot%\syswow64\odbcad32.exe. ** 配置 ODBC DSN。点击
开始->运行
输入:**%SystemRoot%\syswow64\odbcad32.exe**
按回车键
这看起来与您可能从控制面板运行的驱动程序管理器相同,但用于管理 32 位驱动程序。如果您从 System32 目录运行 odbcad32.exe,实际上是在运行 64 位驱动程序管理器。
什么是 WOW64?
如果可能,我会删除其余信息,只包含指向有关 WOW64 的更多信息的链接 - 比如
http://msdn.microsoft.com/en-us/library/aa384274(v=VS.85).aspx 例如。
什么是 WOW64 以及为什么需要它
http://forums.techarena.in/operating-systems/1160164.htm
WoW64 代表“Windows on 64-bit Windows”,它包含所有用于兼容性的 32 位二进制文件,这些文件运行在
64 位 Windows 之上。所以,是的,它看起来像是 System32 中所有内容的双重副本(尽管目录名称如此,但实际上是 64 位二进制文件)。
如果您运行的是 32 位 Windows,那么找到这个 SysWoW64 目录有点奇怪...
WOW64 知道安装向导是在模拟器中运行的 32 位应用程序。它也知道 64 位和 32 位代码不能混合。因此,WOW64 模拟器为 \Windows\SysWOW64 文件夹创建了一个别名。这意味着,每当 32 位应用程序需要读取或写入 \Windows\System32 文件夹中的任何内容时,WOW64 模拟器都会透明地将请求重定向到 \Windows\SysWOW64 文件夹。
Microsoft 在 Windows Vista 64 位操作系统的 WoW(Windows on Windows)目录中提供了一组 32 位可执行文件。
要为 32 位应用程序设置 DSN,您必须使用:**%WINDIR%\SysWOW64\odbcad32.exe**
而对于 64 位应用程序,您必须使用:**%WINDIR%\System32\odbcad32.exe**
因此,要运行 32 位应用程序,我们需要修改 env PATH 变量并将 SysWOW64 放在 system32 之前。
大致步骤如下
1. 启动 **%windir%\SysWoW64\cmd.exe**
2. 设置 **PATH=%systemroot%\SysWOW64;%PATH%**
3. 运行应用程序。
4. 应用完成后,如果需要,请重置 PATH 变量。
希望这对你有所帮助。
或者,如果应用程序无法从 shell 中运行,则可以从系统属性 > 高级选项卡 > 环境变量 > 系统变量中直接修改 PATH 变量。
相应地编辑 PATH 变量并重新启动系统以使更改生效。
还可以查看相关的主题
* Adminpak SP2,Windows Server x64 SP2
<http://forums.techarena.in/windows-x64-edition/810091.htm>
* 需要帮助注册 DLL
<http://forums.techarena.in/windows-x64-edition/804399.htm>
* 证书服务 Web 界面和 Win2k3 x64/AMD64 版本
<http://forums.techarena.in/server-security/598973.htm>
使用 postgresql dbc msi 安装后,您预计注册表将显示的内容的文档
http://archives.postgresql.org/pgsql-interfaces/2001-01/msg00177.php
ftp.postgresql.org 上有两个版本的 ODBC 驱动程序:一个是包含安装程序的完整包,另一个只是驱动程序本身。
使用安装程序安装一次后,只需将新版本的驱动程序复制到 windows\system 即可进行升级。
如果由于某种原因您无法使安装程序正常工作,则可以使用 regedit 手动进行安装。
找到键 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI 并添加以下内容
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\PostgreSQL]
"Setup"="C:\\WINDOWS\\SYSTEM\\PSQLODBC.DLL"
"Driver"="C:\\WINDOWS\\SYSTEM\\PSQLODBC.DLL"
"APILevel"="1"
"ConnectFunctions"="YYN"
"CommLog"="0"
"Optimizer"="0"
"DriverODBCVer"="02.00"
"FileUsage"="0"
"SQLLevel"="1"
"UsageCount"=dword:00000001
"Fetch"="100"
"UniqueIndex"="1"
"ReadOnly"="0"
"UseCursors"="0"
"UnknownSizes"="0"
"TextAsLongVarchar"="0"
"UnknownsAsLongVarchar"="0"
"MaxVarcharSize"="254"
"MaxLongVarcharSize"="4094"
"ConnSettings"=""
"UseDeclareFetch"="0"
"BoolsAsChar"="0"
"ExtraSysTablePrefixes"="dd_;"
"Parse"="1"
"Ksqo"="1"
"CancelAsFreeStmt"="0"
(注意:检查系统中的上述路径)
找到键 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers 并添加一个条目 "PostgreSQL= 已安装"。
来自 Mark Wood 的办公桌 ([email protected] ) 20100524