首页 > 解决方案 > 键入名称时,SQLite 在属性名称中不返回此类列错误,但从 create 语句复制时有效

问题描述

我在 SQLite 中有一个 SQL 查询,其中包括带有下划线_字符的列名。当我Nom_ligne在查询中输入列名 ( ) 时遇到问题(我得到SQL error: no such column)。当我在使用PRAGMA table_info. 它们看起来与我相同,但 Notepad++ 无法将列名识别为相同(当您单击一组字符时,它会突出显示同一组字符的所有出现)。

发现有两种不同的下划线字符看起来相同。如何选择输入正确的类型?这是我的代码行的问题吗(见下文)?

在此处输入图像描述

这是我的代码行与不同的字符。

> #this works 
SELECT train_arret.stop_name FROM train_arret_ligne, lignes_train, train_arret WHERE
train_arret.stop_code_=train_arret_ligne.ID_arret AND
train_arret_ligne.ligne_code=lignes_train.ID_ligne AND
lignes_train.Nom_ligne="Candiac"
> 
##returns error SQL error: "no such column: lignes_train.Nom_ligne" 
SELECT train_arret.stop_name FROM train_arret_ligne, lignes_train,
train_arret WHERE train_arret.stop_code_=train_arret_ligne.ID_arret
AND train_arret_ligne.ligne_code=lignes_train.ID_ligne AND
lignes_train.Nom_ligne="Candiac"
> 
> #these work 
SELECT lignes_train.ID_ligne FROM lignes_train WHERE             
lignes_train.Nom_ligne="Candiac"

编辑:

我从头开始输入这个(没有复制粘贴),我得到了一个错误。

SELECT train_arret.stop_name FROM train_arret_ligne, lignes_train, train_arret
WHERE train_arret.stop_code_=train_arret_ligne.ID_arret AND
train_arret_ligne.ligne_code=lignes_train.ID_ligne AND
lignes_train.Nom_ligne="Candiac"

更多编辑:

当我通过十六进制编辑器复制代码行时FlexHEX,我发现额外的隐藏字符EF BB BF对于让代码在 SQL 查询中工作是必要的。当我在文本上移动时,我还可以检测到 SQLITE/SPATIALLITE 中的额外字符。它在 中显示如下FlexHEX

#doesn't work
lignes_train.ID_ligne 
#works
lignes_train.ID_ligne

这是我要求 SQLITE/SPATIALLITE 向我展示创建语句时得到的结果

CREATE TABLE "lignes_train" (
"PK_UID" INTEGER PRIMARY KEY AUTOINCREMENT,
"ID_ligne" INTEGER,
"Nom_ligne" TEXT)

标签: sqlsqlitecharacter-encoding

解决方案


采用不会产生错误的列名之一:

$ echo 'lignes_train.Nom_ligne' | xxd
00000000: 6c69 676e 6573 5f74 7261 696e 2e4e 6f6d  lignes_train.Nom
00000010: 5f6c 6967 6e65 0a                        _ligne

确实产生错误的列名:

$ echo 'lignes_train.<feff>Nom_ligne' | xxd
00000000: 6c69 676e 6573 5f74 7261 696e 2eef bbbf  lignes_train....
00000010: 4e6f 6d5f 6c69 676e 650a                 Nom_ligne.

如您所见,由于某种原因,EF BB BF在句点和列名之间有三个额外的字节。这些字节不是有效的 UTF-8 编码字符,因此显示<feff>在我的 shell 中。我不知道你的编辑器为什么不做类似的事情(假设你告诉它使用 UTF-8 作为那个缓冲区,因为它是 sqlite 使用的默认文本编码,你真的应该......我'我也很惊讶 SO 没有指出它们)。这就是错误的原因。下划线字符U+005F在两者中是相同的。

信用应该去@Cid找到它。


推荐阅读