所以,我在Firebird中使用Python fdb库创建了一个表,如下所示:
>>> import fdb
>>> conn = fdb.connect(...)
>>> sql = "CREATE TABLE test_table(id integer not null)"
>>> cursor = conn.cursor()
>>> cursor.execute(sql)
>>> conn.commit()
然而,当我列出表格时,我得到了这个奇怪的结果:
>>> tables = []
>>> sql = "select rdb$relation_name from rdb$relations
where rdb$view_blr is null and (rdb$system_flag is null or rdb$system_flag = 0)"
>>> cursor.execute(sql)
>>> res = cursor.fetchall()
for r in res:
tables.append(r[0])
>>> tables
['TEST_TABLE ']
到底发生了什么事?这个愚蠢的额外空间来自哪里?为什么我的表名为"TEST_TABLE "
而不只是"TEST_TABLE"
?
答案 0 :(得分:5)
字段:
RDB$RELATION_NAME is CHAR(31)
CHAR用空格填充。
最重要的区别是CHAR用空格填充 VARCHAR不是。例如,如果您有:
CREATE TABLE t1(c1 VARCHAR(2),c2 CHAR(2));
INSERT INTO t1(c1,c2)VALUES('a','a');
列c1将包含值'a',而列c2将包含 带有额外空间的值'a'。 进行比较时会忽略尾随空格,因此两列都将与
匹配WHERE c ='a'
某些查询的子句。 LIKE运算符尊重尾随空格,这对于初学者来说是一个混乱的来源