
在 SQLite 查询中,直接写 SELECT t, 80 FROM table 会将 80 解析为常量数值而非列名,导致每行第二项恒为字面量 80;若需引用名为 "80" 的列,必须用方括号 [] 或双引号 "" 显式标识为标识符。
在 sqlite 查询中,直接写 `select t, 80 from table` 会将 `80` 解析为常量数值而非列名,导致每行第二项恒为字面量 80;若需引用名为 `"80"` 的列,必须用方括号 `[]` 或双引号 `""` 显式标识为标识符。
当你执行如下 SQL:
sql_request = 'SELECT t,80 FROM SS_SZT'
SQLite 将 80 视为整数常量(literal),而非列名——因此结果中第二列始终固定输出数值 80,与表中是否存在名为 80 的字段完全无关。这也是你看到 (12.0, 80), (8.0, 80) 等重复值的根本原因。
✅ 正确做法:若数据表 SS_SZT 中真实存在一列名为 "80"(例如存储某年份、编号或特殊指标),必须使用标识符转义语法明确告知 SQLite 这是一个列名,而非数字字面量。SQLite 支持两种标准方式:
-
方括号语法(推荐,简洁且兼容多数工具):
SELECT t, [80] FROM SS_SZT
-
双引号语法(符合 SQL 标准):
SELECT t, "80" FROM SS_SZT
? 注意事项:
- 单引号 '80' 是字符串常量,不可用于列名(会导致语法错误或意外结果);
- 反引号 `80` 在 SQLite 中不被支持(仅 MySQL 支持),切勿混用;
- 列名含数字、空格、特殊字符或为关键字(如 order, group)时,必须加转义,否则查询失败或行为异常;
- 建议在建表时避免使用纯数字作为列名,优先采用语义化命名(如 value_80, score_2023),提升可读性与可维护性。
? 示例修正后的完整代码:
import sqlite3
def request():
with sqlite3.connect('sqlite_db.db') as sqlite_conn:
# ✅ 正确:[80] 表示列名,非常量
sql_request = 'SELECT t, [80] FROM SS_SZT'
sql_cursor = sqlite_conn.execute(sql_request)
res = sql_cursor.fetchall()
for row in res:
print(row) # 输出类似 (12.0, 25.6), (8.0, 24.1) …(真实列值)
request()
? 提示:可通过 PRAGMA table_info(SS_SZT); 快速验证表结构,确认列名是否确实为 80:
# 调试用:查看 SS_SZT 表所有列名及类型
cursor = sqlite_conn.execute("PRAGMA table_info(SS_SZT)")
print(cursor.fetchall())
总结:SQL 中字面量(literal) 与标识符(identifier) 有严格区分。数字 80 默认是字面量;要将其作为列名使用,必须显式转义。掌握这一基本规则,可避免大量“列值取不出来”的隐性错误。










