SQL为什么输入的字符串变成了0?

SQL why input string becomes 0?

我正在使用 python 的 psycopg2 创建一个 table 并且插入的 SQL 字符串看起来像这样

create_table ='''CREATE TABLE Datetime_Response(
   rid BIGINT NOT NULL,
   qid BIGINT,
   roid BIGINT,
   rotext VARCHAR(20)
)'''

INSERT INTO Datetime_Response (rid, qid, roid, rotext)
VALUES
 (13020638659, 711799502, 4681912759, 07/21/2021)

但是输出很奇怪。所有日期时间字符串变为 0。我在 rotext 列中同时尝试了 VARCHARTEST。他们都显示0。我不知道出了什么问题。

(13020638659, 711799502, 4681912759, '0')

这就是 values 的样子

values = list(entry.values())
        print(values)
['13020638659', '711799502', '4681912759', '07/21/2021']

这就是插入语法的样子

values_str = "(%s)" % (', '.join( values ))
sql_string = "INSERT INTO %s (%s)\nVALUES\n %s" % (
            table_name,
            ', '.join(columns),
            values_str
        )
        print(sql_string)
INSERT INTO GZ_Datetime_Response (rid, qid, roid, rotext)
VALUES
 (13020638659, 711799502, 4681912759, 07/21/2021)

因为 7 除以 21 除以 2021 接近于零。如果两个操作数都是整数,则 / 是 Python 2 中的整数除法。引用你的价值:07/21/2021

您的查询会受到您脚本的恶意用户的 SQL 注入攻击!

values = list(entry.values())
        print(values)
['13020638659', '711799502', '4681912759', '07/21/2021']
values_str = "(%s)" % (', '.join( values ))
sql_string = "INSERT INTO %s (%s)\nVALUES\n %s" % (
            table_name,
            ', '.join(columns),
            values_str
        )
        print(sql_string)

当使用您的字符串值来格式化您的字符串时,您将得到:

INSERT INTO GZ_Datetime_Response (rid, qid, roid, rotext) VALUES (13020638659, 711799502, 4681912759, 07/21/2021)

其中不包含任何引号。 使用准备好的语句 来避免错误类型引起的问题,并阻止黑客滥用您的 application/database。

如果出于某种原因不能使用准备好的语句,请确保字符串在最终语句中以字符串形式结束:

  1. values = ['13020638659', '711799502', '4681912759', "'07/21/2021'"]
  2. INSERT INTO GZ_Datetime_Response (rid, qid, roid, rotext) VALUES (%s, %s, %s, '%s)

这样做。让连接器填写正确引用的值:

sql_string = "INSERT INTO %s (%s)\nVALUES (%s)" % (
            table_name,
            ','.join(columns),
            ','.join(['?']*len(values))
        )
cur.execute( sql_string, values )