【问题标题】:Data type equivalents: MS Access Tables ↔ 'CREATE TABLE' Queries ↔ ODBC SQL数据类型等效项:MS Access 表 ↔ 'CREATE TABLE' 查询 ↔ ODBC SQL
【发布时间】:2018-10-11 03:56:27
【问题描述】:

使用 SQL 在 Access 中创建表时的正确语法是什么?我已经尝试过 DECIMAL、DOUBLE、NUMBER、INT... 没有什么可以让我创建带有限制器的整数类别。

例子:

CREATE TABLE NONGAME (
  ITEM_NUM CHAR(4) NOT NULL PRIMARY KEY,
  DESCRIPTION CHAR(30),
  ON_HAND NUMBER(4),   <------- DOES NOT WORK!
  CATEGORY CHAR(3),
  PRICE DECIMAL(6,2),  <------- DOES NOT WORK!
  ANYTHING DOUBLE(4,2) <------- DOES NOT WORK!
);

【问题讨论】:

  • 根据文档,我不能这样做。感谢您非常有用的评论!
  • 不客气。看起来它会引导您找到解决方案。下面是我从文档中复制的更多信息,显示了 Access 中 3 组数据类型之间的差异。
  • 您似乎试图在 Microsoft Access 中使用 MySQL 语法(类似于 Microsoft SQL-Server 环境。)

标签: sql ms-access types type-conversion sqldatatypes


【解决方案1】:

微软访问数据类型

下表显示了Microsoft Access 数据类型、用于创建表 的数据类型和ODBC SQL 数据类型。某些类型有限制,如下表所示。

Microsoft Access data type        Data type (CREATE TABLE) ODBC SQL data type  
~~~~~~~~~~~~~~~~~~~~~~~~~~        ~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~  
BIGBINARY[1]                      LONGBINARY               SQL_LONGVARBINARY   
BINARY                            BINARY                   SQL_BINARY          
BIT                               BIT                      SQL_BIT             
COUNTER                           COUNTER                  SQL_INTEGER         
CURRENCY                          CURRENCY                 SQL_NUMERIC         
DATE/TIME                         DATETIME                 SQL_TIMESTAMP       
GUID                              GUID                     SQL_GUID            
LONG BINARY                       LONGBINARY               SQL_LONGVARBINARY   
LONG TEXT                         LONGTEXT                 SQL_LONGVARCHAR[2]  
MEMO                              LONGTEXT                 SQL_LONGVARCHAR[2]  
NUMBER (FieldSize= SINGLE)        SINGLE                   SQL_REAL            
NUMBER (FieldSize= DOUBLE)        DOUBLE                   SQL_DOUBLE          
NUMBER (FieldSize= BYTE)          UNSIGNED BYTE            SQL_TINYINT         
NUMBER (FieldSize= INTEGER)       SHORT                    SQL_SMALLINT        
NUMBER (FieldSize= LONG INTEGER)  LONG                     SQL_INTEGER         
NUMERIC                           NUMERIC                  SQL_NUMERIC         
OLE                               LONGBINARY               SQL_LONGVARBINARY   
TEXT                              VARCHAR                  SQL_VARCHAR[1]      
ARBINARY                          VARBINARY                SQL_VARBINARY       

[1] Access 4.0 applications only. Max 4000 B. Behaviour similar to LONGBINARY.
[2] ANSI applications only.
[3] Unicode and Access 4.0 applications only. 

注意: SQLGetTypeInfo 返回 ODBC 数据类型。如果多个Microsoft Access 类型映射到相同的ODBCSQL 数据类型,它不会返回所有Microsoft Access 数据类型。上表中列出的SQL 数据类型支持Appendix D of the ODBC Programmer's Reference 中的所有转换。


Microsoft Access 数据类型的限制

  • BINARY**、**VARBINARY** 和 **VARCHAR:创建零或未指定长度的 BINARYVARBINARYVARCHAR 列实际上返回 510 字节列。
  • BYTE:即使带有FieldSize 等于BYTE 的Microsoft Access NUMBER 字段是无符号的,但在使用Microsoft Access 驱动程序时可以在该字段中插入一个负数。
  • CHAR**、**LONGVARCHAR** 和 **VARCHAR:字符串文字可以包含任何 ANSI 字符(十进制 1-255)。使用两个连续的单引号('')来表示一个单引号(')。在字符数据类型列中使用任何特殊字符时,应使用过程来传递字符数据。
  • DATE:日期值必须根据 ODBC 规范日期格式分隔或由日期时间分隔符 (#) 分隔。否则,Microsoft Access 会将值视为算术表达式,并且不会引发警告或错误。
    • 例如日期“March 5, 1996”必须表示为{d '1996-03-05'}#03/05/1996#;否则,如果只提交了03/05/1993,Microsoft Access 会将其评估为3 ÷ 5 ÷ 1996。该值向上舍入为整数0,并且由于零日映射到1899-12-31,因此这是使用的日期。
    • 管道字符 (|) 不能用于日期值,即使用反引号括起来。
  • GUID:数据类型仅限于 Microsoft Access 4.0。
  • NUMERIC:数据类型仅限于 Microsoft Access 4.0。

(更多信息请关注Source


对 ODBC 桌面驱动程序数据类型的限制

Microsoft ODBC 桌面数据库驱动程序对数据类型施加了以下限制:

  • 所有数据类型 类型转换失败可能会导致受影响的列被设置为NULL
  • BINARY 创建一个长度为零的BINARY 列实际上会返回一个255 字节的BINARY 列。
  • DATE DATE 数据类型无法通过CONVERT 函数转换为另一种数据类型(或自身)。
  • DECIMAL(精确数字)** 不支持。
  • Floating-Point Data Types 浮点数的小数位数可能受 International 部分中设置的数字格式限制em>Windows 控制面板。
  • NUMERIC 支持最高精度和 28 的小数位数。
  • TIMESTAMP CONVERT 函数无法将TIMESTAMP 数据类型转换为自身。
  • TINYINT:TINYINT 值始终是无符号的。
  • Zero-Length Strings:当使用 dBASE、Microsoft Excel、Paradox 或 Textdriver 时,将长度为零的字符串插入列实际上会插入 NULL

(Source)


更多信息:


Erik的小附录:

您实际上可以在CREATE TABLE 查询中使用Decimal 数据类型。但是,这需要使用 ADO 或在设置为使用 ANSI-92 兼容语法的数据库上执行您的语句。

要将您的数据库设置为 ANSI-92 兼容的语法:

转到文件 -> 选项。打开选项卡对象设计器。转到查询设计器,在 SQL Server Compatible Syntax (ANSI 92) 下,选中This Database。现在您可以执行查询。请注意,这会影响数据库中的所有查询,并以多种方式影响查询。

使用 ADO 执行查询:

在 VBA 即时窗口中,执行以下行:

CurrentProject.Connection.Execute "CREATE TABLE NONGAME (ITEM_NUM CHAR(4) NOT NULL PRIMARY KEY,  PRICE DECIMAL(6,2));"

当然,您可以使用 ADO 执行更复杂的查询。

【讨论】:

  • 您可能还想解释如何在创建表查询中使用 DAO 或 ODBC 不支持的数据类型,如 Decimal。这是我解释问题的很大一部分
  • @Erik - 有每个可能的数据类型的列表以及如何转换为它们的说明的链接。似乎正确的做法是查看列表并找到类似的类型(可能是DOUBLE 而不是DECIMAL),然后使用它。 OP 尝试使用 DOUBLE 但语法不正确。我的 cmets 分享了我对他误解的地方的看法,并且脚注澄清了 DECIMAL 没有确切的等价物。同样,链接将导致解决方案。
  • @ErikvonAsmuth - 大部分内容都是在 OP 无论如何找到答案后发布的。我已经基本上将三个完整的信息链接复制到了这个答案中,因为 OP 很难自己找到它。你是在建议我多复制几个吗?
  • 嗯,您可以通过将模式切换到 SQL-92 兼容语法或使用 ADO 执行查询 (CurrentProject.Connection.Execute) 在 Access 中使用 Decimal 就好了。我希望你能添加它,因为我目前正在使用我的手机。但是如果您不熟悉或不想添加它,我会写我自己的答案。
  • 我希望看到每个问题都得到正确回答,不是针对 OP,而是针对未来的访客,尤其是因为这是一个常见且有些复杂的问题。我希望将所有信息都包含在一个答案中,以便将来的读者更容易找到。我不是一个鼓励复制的人,我喜欢写自己的答案,但如果你有一个很好的来源,可以分享,请继续。
【解决方案2】:

DECIMAL 和 DOUBLE 不能在 Access 中使用。对于“价格”,CURRENCY 是最好的选择。对于我的另一个整数,我只使用了 NUMBER 并且没有给它任何限制。

【讨论】:

  • Access 的最新版本(甚至回到 2007 iirc)都支持 Decimal 和 Double。使用 GUI、ODBC 或 DAO 执行的 DDL 查询不支持小数。这个答案是完全不正确的。您可以通过在 GUI 中创建具有这些字段类型的表来轻松检查这一点。通过一些技巧,你也可以在 SQL 语句中使用它们
  • 虽然使用 Currency 作为价格和金额是正确的,但从 1.0 版开始,Double 肯定“始终”存在于 Access 中。
猜你喜欢
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多