我正在使用Python 2.7和MySQLdb。我试图更新并设置为我设置为数据的小数的数字,但我得到的是一个最接近的整数。这是代码:
Value = 5
data = 5
data = data + 0.5
print(data)
x.execute(""" UPDATE Testing SET number = %s WHERE id = %s """, (data, Value))
conn.commit()
例如,如果data = 5.5并且我尝试更新数据库,我在表中看到当我希望它为5.5时数字为6。我见过其他人问同样的问题,但不是Python。 Number是INT。请你帮助我好吗?提前谢谢。
答案 0 :(得分:2)
number
数据库表中的Testing
列显然具有整数数据类型。您可以通过查询EXPLAIN Testing
来检查数据类型。如果它具有整数数据类型,则number
值在存储到表中之前被强制转换为整数。
如果您希望存储小数,则需要先更改表格:
ALTER TABLE `Testing` CHANGE `number` `number` DECIMAL(M,D)
其中(每the docs):
M
是最大位数(精度)。它的范围是1到65.
D
是小数点右边的位数(比例)。它
范围为0到30,且不得大于M
。
例如,如果我们创建一个Testing
表,number
的数据类型为INT(11)
:
import MySQLdb
import config
def show_table(cursor):
select = 'SELECT * FROM Testing'
cursor.execute(select)
for row in cursor:
print(row)
def create_table(cursor):
sql = 'DROP TABLE Testing'
cursor.execute(sql)
sql = '''CREATE TABLE `Testing` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`number` INT(11),
PRIMARY KEY (id))'''
cursor.execute(sql)
with MySQLdb.connect(host=config.HOST, user=config.USER,
passwd=config.PASS, db='test') as cursor:
create_table(cursor)
假设该表具有number = 5
的记录:
insert = 'INSERT INTO Testing (number) VALUE (%s)'
cursor.execute(insert, (5,))
show_table(cursor)
# (1L, 5L)
如果我们尝试将number
设置为5.5:
update = 'UPDATE Testing SET number = %s where id = %s'
cursor.execute(update, [5.5, 1])
而是将数字存储为6:
show_table(cursor)
# (1L, 6L)
如果我们将number
字段的数据类型更改为DECIMAL(8,2):
alter = 'ALTER TABLE `Testing` CHANGE `number` `number` DECIMAL(8,2)'
cursor.execute(alter)
然后将数字设置为5.5将number
存储为小数:
cursor.execute(update, [5.5, 1])
show_table(cursor)
# (1L, Decimal('5.50'))
当然,或者,您可以从头开始创建一个Testing
表,其中number
字段带有DECIMAL数据类型,然后浮点数将从头开始存储为小数。
PS。对我来说,如果你真的想要一个DECIMAL(M,D)
数据类型,那就不太清楚了。如果您使用DECIMAL(M,D)
,则查询该表将返回number
s,它们是Python端的decimal.Decimal
。如果您只想要常规的Python浮点数,那么使用数据类型为Testing
而不是number
的{{1}}字段定义FLOAT
。