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
列中同时尝试了 VARCHAR
和 TEST
。他们都显示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。
如果出于某种原因不能使用准备好的语句,请确保字符串在最终语句中以字符串形式结束:
values = ['13020638659', '711799502', '4681912759', "'07/21/2021'"]
- 或
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 )
我正在使用 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
列中同时尝试了 VARCHAR
和 TEST
。他们都显示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。
如果出于某种原因不能使用准备好的语句,请确保字符串在最终语句中以字符串形式结束:
values = ['13020638659', '711799502', '4681912759', "'07/21/2021'"]
- 或
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 )