Firebird中的表名有很多额外的空间

时间:2016-05-17 10:25:01

标签: sql firebird

所以,我在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"

1 个答案:

答案 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运算符尊重尾随空格,这对于初学者来说是一个混乱的来源

请参阅:http://www.firebirdfaq.org/faq237/