代码之家  ›  专栏  ›  技术社区  ›  kl-higgins

当输入名称时,sqlite在属性名中不返回这样的列错误,但当从create语句复制时,它会工作。

  •  0
  • kl-higgins  · 技术社区  · 5 年前

    我在sqlite中有一个SQL查询,其中包含带下划线的列名 _ 字符。键入列名时遇到问题( Nom_ligne )进入查询(我得到 SQL error: no such column )使用后,当我复制粘贴列名时,我可以使查询正常工作。 PRAGMA table_info . 它们看起来与我完全相同,但记事本+无法将列名识别为相同(单击一组字符时,它会突出显示同一组字符的所有出现)。

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

    enter image description here

    这里是我的代码行,有不同的字符。

    > #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中的额外字符。在 挠曲 :

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

    下面是我请求sqlite/spatiallite显示create语句时得到的结果

    CREATE TABLE "lignes_train" (
    "PK_UID" INTEGER PRIMARY KEY AUTOINCREMENT,
    "ID_ligne" INTEGER,
    "Nom_ligne" TEXT)
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Shawn    5 年前

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

    $ 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> 在我的壳里。我不知道为什么你的编辑器没有做类似的事情(假设你告诉它对缓冲区使用UTF-8,因为它是sqlite使用的默认文本编码,所以你真的应该……我也很惊讶,所以没有指出它们)。这就是错误的原因。下划线字符, U+005F 两者都一样。

    信用证应该去@cid找到它。