sql - 键入名称时,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)
解决方案
采用不会产生错误的列名之一:
$ 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找到它。
推荐阅读
- javascript - 如何对数组进行排序以按降序而不是字母顺序显示具有covid病例的国家/地区的数据?
- javascript - 使用 jquery 选择项目后是否可以关闭菜单?
- xcode - AudoiDeviceGetCurrentTime:xcode 中没有给定 ID 错误的设备
- apache-kafka - 如何在生产者端使用 Kafka 进行容错
- oracle - 将 Netbeans 连接到 Oracle SQL(远程主机)引发异常
- angular - @NgRx 如何在实体之间建立多对多关系?
- json - 正则表达式范围选择
- c# - 需要不强制数据一致性的高性能 C# 集合
- reactjs - MDB DataTable text-align on th 和 td 在 ReactJS
- java - 是否有任何 API 可用于阿联酋通行证的数字签名