SQLite表首列查询报错:no such column: Name 求助
SQLite首列查询报错:Error: no such column: Name 的解决方法
问题现象
导入CSV文件到SQLite后,查询第一列Name时报错Error: no such column: Name,但查询其他列(如Count)正常。完整操作日志如下:
bash-3.2$ head Names/nameTest1.csv Name,Gender,Count James,M,5304407 John,M,5260831 Robert,M,4970386 ... bash-3.2$ sqlite3 test1.db SQLite version 3.19.3 2017-06-08 14:26:16 Enter ".help" for usage hints. sqlite> .mode csv sqlite> .separator ',' sqlite> .import Names/nameTest1.csv testtable1 sqlite> .schema CREATE TABLE testtable1( "Name" TEXT, "Gender" TEXT, "Count" TEXT ); sqlite> select * from testtable1 where Count='5304407'; James,M,5304407 sqlite> select * from testtable1 where Name='James'; Error: no such column: Name sqlite> .quit
临时解决方案是给CSV添加虚拟首列,但该方案并不理想。运行环境:Mac mini(M1,2020),macOS Monterey Version 12.5.1。
问题根源
从.schema输出可见,第一列的列名被双引号包裹为"Name"——引号内的Name前存在一个不可见的特殊字符(大概率是UTF-8的BOM字节EF BB BF)。这个BOM是CSV文件开头的编码标记,SQLite导入时将其识别为列名的一部分,导致实际列名并非Name,而是带有BOM前缀的特殊名称。
解决步骤
移除CSV文件的BOM标记
- Mac环境下可直接用
sed命令去除:sed -i '' '1s/^\xef\xbb\xbf//' Names/nameTest1.csv - 也可通过文本编辑器(如VS Code)处理:打开CSV文件,在右下角编码选项中切换为
UTF-8(而非UTF-8 with BOM),保存即可。
- Mac环境下可直接用
重新导入数据
删除现有数据库文件,重新执行导入操作:rm test1.db sqlite3 test1.db sqlite> .mode csv sqlite> .separator ',' sqlite> .import Names/nameTest1.csv testtable1验证查询
再次执行查询,此时Name列可正常访问:sqlite> select * from testtable1 where Name='James'; James,M,5304407
临时替代方案(不推荐)
若不想修改原始CSV,可直接使用.schema中显示的带BOM列名查询(需完整复制引号内的内容):
select * from testtable1 where "Name"='James';
但该方式会导致列名包含不可见字符,后续维护易出问题,不建议长期使用。
内容的提问来源于stack exchange,提问作者mks
相关产品推荐
相关产品推荐

