有人可以告诉我为什么会出现此错误,是因为间隔(我知道报价很重要)吗?

时间:2020-09-20 03:11:22

标签: postgresql macos

undefined

1 个答案:

答案 0 :(得分:1)

正如一些人在注释中指出的那样,您的SQL中有一些看不见的字符(有时称为“ gremlins”)使它无效。这是内容的十六进制转储(使用macOS命令从问题中复制代码之后):

$ pbpaste | xxd -g1
00000000: 63 72 65 61 74 65 20 74 61 62 6c 65 20 70 72 6f  create table pro
00000010: 64 75 63 74 28 0a 70 72 6f 64 75 63 74 69 64 20  duct(.productid 
00000020: 69 6e 74 2c e2 80 a8 0a 64 65 73 63 72 69 70 74  int,....descript
                      ^^ ^^ ^^                                 ^^^
00000030: 69 6f 6e 20 76 61 72 63 68 61 72 28 32 30 29 0a  ion varchar(20).
00000040: 29 3b 0a e2 80 a8 69 6e 73 65 72 74 20 69 6e 74  );....insert int
00000050: 6f 20 70 72 6f 64 75 63 74 20 28 e2 80 a8 70 72  o product (...pr
00000060: 6f 64 75 63 74 69 64 2c e2 80 a8 64 65 73 63 72  oductid,...descr
                                  ^^ ^^ ^^                         ^^^

00000070: 69 70 74 69 6f 6e 20 29 e2 80 a8 56 61 6c 75 65  iption )...Value
                                  ^^ ^^ ^^                         ^^^
00000080: 73 20 28 20 34 32 20 2c 20 27 20 74 76 27 29 3b  s ( 42 , ' tv');
00000090: 0a 45 52 52 4f 52 3a 20 20 63 6f 6c 75 6d 6e 20  .ERROR:  column 
000000a0: 22 64 65 73 63 72 69 70 74 69 6f 6e 22 20 6f 66  "description" of
000000b0: 20 72 65 6c 61 74 69 6f 6e 20 22 70 72 6f 64 75   relation "produ
000000c0: 63 74 22 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ct" does not exi
000000d0: 73 74                                            st

(请注意,xxd在右侧的文本显示中将不对应于可打印ASCII字符的字节表示为“。”。十六进制的与0a对应的“。”是换行符。)

十六进制代码e2 80 a8对应于unicode "line separator" character的UTF-8编码。我不知道那个角色是怎么进入那里的。您必须追溯该代码段的来源以弄清楚它们的添加位置。

我要避免将TextEdit用于源代码(以及配置文件等)。相反,我建议使用BBEdit或其他一些面向代码的编辑器。我认为即使在BBEdit的自由演示模式下,也可以通过选择查看菜单->文本显示->显示不可见项来显示(并让您删除)通常不可见的字符。

您还可以使用以下方法从macOS终端中的文本文件中删除非纯ASCII字符:

LC_ALL=C tr -d '\n\t -~' <infile.txt >cleanfile.txt

(用输入文件的路径/名称以及您要存储输出的位置替换infile.txtcleanfile.txt。)警告:不要 not 尝试编写将内容清理回原始文件,将无法正常工作。另外,不要使用它来清除纯文本文件以外的任何内容(如果文件中的任何部分都不应该是文本部分,则可能会破坏这些部分)。保留原始文件作为备份,直到您确认“干净”版本能正常工作为止。

您还可以使用以下方法“清理”粘贴缓冲区:

pbpaste | LC_ALL=C tr -d '\n\t -~' | pbcopy

...所以只需从文本编辑器中复制相关代码,在Terminal中运行该代码,然后将清理后的版本粘贴回编辑器中即可。