【问题标题】:Strange syntax error in simple CREATE TABLE command - PostgreSQL, MySQL, & SQLite简单 CREATE TABLE 命令中的奇怪语法错误 - PostgreSQL、MySQL 和 SQLite
【发布时间】:2021-05-15 18:50:48
【问题描述】:

我收到一个我不理解的 PostgreSQL、MySQL 和 SQLite 语法错误。当从 Python 运行相同的 CREATE TABLE 命令并作为 pgAdmin4 和 MySQL WorkBench 中的查询时,就会发生这种情况。使用 MS SQL Server Management Studio,同样的命令在 SQL Server 上也能完美运行。

命令是:

create table asDataSpecs ( NumField1 integer, CharField1 char(30), CharField2 char(30) )

pgAdmin4 显示错误信息:

LINE 1: ...e asDataSpecs ( NumField1 integer, CharField1 char(30), Char...
                                                             ^
SQL state: 42601
Character: 62

MySQL 在同一点生成“错误代码:1064”: 错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '(30), CharField2 char(30) )' 附近使用正确的语法

当此命令在 Python 中运行时,PostgreSQL 和 MySQL 在同一点失败是可以理解的 - 作为连接到适当后端和数据库的游标上的 .execute()。

SQLite(在同一个 Python 程序中使用 .execute() 运行)可能在同一点产生错误: 尝试创建“asDataSpecs”表时“尝试”失败 “(”附近:语法错误

为什么 PostgreSQL、MySQL 和 SQLite 接受“整数”字段,但拒绝第一个“字符”字段 - 而 MS SQL Server 运行正常?

(我认为这不是凭据问题,因为我成功地使用具有相同凭据的 ODBC 在同一数据库中创建了其他表 - 在所有四个后端中。如果凭据是问题,我会看到不同的错误消息- 它不应该接受数字字段。)

【问题讨论】:

  • Works for meworks for meworks for me。确保您提供minimal reproducible example 并强调“可重复性”。检查那里是否有任何时髦但不可见的字符。
  • 感谢这个“粘性位”。似乎这可能是由于时髦的角色。重新输入“Char(”位后,它现在可以在 pgAdmin4 和 Workbench 中使用。我现在将返回并在 Python 程序中执行此操作。希望现在也可以使用。
  • 不相关,但是:don't use char
  • 感谢您提供指向 PostgreSQL“Don't_do_this”页面的链接。该页面上还有许多其他有用的提示。

标签: mysql postgresql sqlite create-table


【解决方案1】:

就是这样 - 时髦的隐藏角色。 (字段名称和数据类型之间有一些高位 ASCII 字符而不是普通空格(ASCII 32)。)

所有平台现在都按预期工作,在 Python 程序和各自的后端管理控制台中。

对于任何感兴趣的人,甚至 NotePad++ 都将其显示为一个空格。但基本的 Windows 记事本揭示了其中的奥秘。

再次感谢“粘性位”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-30
    • 2017-06-30
    • 1970-01-01
    • 2013-12-30
    • 2012-07-08
    • 2013-10-06
    • 1970-01-01
    相关资源
    最近更新 更多