【问题标题】:MYSQL float value can't update if the first number behind comma is 0如果逗号后面的第一个数字是 0,则 MYSQL 浮点值无法更新
【发布时间】:2019-03-26 02:46:28
【问题描述】:

我想问一下MySql float 格式。我尝试插入浮点值,例如12345.66,它没有错误地插入,并且值完全相同。但是如果我尝试插入像12345.01 这样的值,插入的值就像这样12345.00。我尝试了任何具有.0* 的值,并且它始终插入为.00。为什么会这样?

我尝试从终端和 phpmyadmin 使用 MYSQL。 对不起我的英语不好。

这是我的 MYSQL 版本:

+-------------------------+-------------------------+
| Variable_name           | Value                   |
+-------------------------+-------------------------+
| innodb_version          | 5.7.23                  |
| protocol_version        | 10                      |
| slave_type_conversions  |                         |
| tls_version             | TLSv1,TLSv1.1           |
| version                 | 5.7.23-0ubuntu0.16.04.1 |
| version_comment         | (Ubuntu)                |
| version_compile_machine | x86_64                  |
| version_compile_os      | Linux                   |
+-------------------------+-------------------------+

这是我的创建表。所有的浮动都有同样的问题。

CREATE TABLE `angsurantempo` ( 
`ID` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`NoPA` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`Periode` int(11) NOT NULL,
`TglEfektif` datetime NOT NULL,
`Pokok` float(18,2) NOT NULL,
`Bunga` float(18,2) NOT NULL, 
`Denda` float(18,2) NOT NULL,
`Hari` int(11) NOT NULL,
`TglPost` datetime NOT NULL,
`LogPost` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
`IDKop` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`ID`,`IDKop`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

我的插入查询:

INSERT INTO angsurantempo VALUES ('11372','PA-201708-002','15','2017-08-26 00:00:00','1882755.08','2261277.05','0','31','2017-08-30 15:16:00','PAA-201708-007','MAS1')

此MYSQL服务器安装在VPS Ubuntu中

【问题讨论】:

  • 能否分享一下你的表结构
  • 我的意思是在你的终端上输入这个命令SHOW CREATE TABLE your_table_name \G
  • 我已经编辑了我的问题。添加显示创建表。感谢您回答我的问题
  • 我无法在 MySQL 5.6 上复制您的问题。您的INSERT 查询是什么样的?
  • 我在帖子中包含了我的上传查询之一。我也无法在我的 PC 和笔记本电脑中复制该问题。我的笔记本电脑运行的是相同的 MYSQL 版本,但运行的是 ubuntu 18,而我的 PC 运行的是 mysql 版本 5.0。如果我在浮点数上插入值,并且 0 是点后的第一个数字,我的笔记本电脑和个人电脑都没有这个问题。

标签: mysql ubuntu phpmyadmin


【解决方案1】:

您可以使用decimal(7,2) 数据类型来存储精确的十进制值。

【讨论】:

  • 是的,工作正常。但我想知道为什么 float 不能存储精确的十进制值?它只发生在我的 VPS 中。在我的本地 PC 中,float 可以存储精确的十进制值。
【解决方案2】:

如果要插入12345.01,是不可能的

我认为您不能在小数点后放置逗号(,)

【讨论】:

  • 不,我的意思是如果点后面的第一个数字是0,那么点后面的所有值都设置为00,即使我插入了.0102 等值,所有的变成00
  • 我可以看看你表的结构吗?使用 SHOW CREATE TABLE [表名] 查询
  • 你可以在我的问题中看到。我已经更新了。谢谢回答
【解决方案3】:

您应该使用此命令将表中该字段的数据类型从 float 更改为 double

ALTER TABLE your_table_name
MODIFY your_column_name DOUBLE NOT NULL;

【讨论】:

  • 是的,我正在尝试。但是为什么我的mysql中只有float不能使用那种格式呢?此服务器在 VPS 中运行。那是我的问题。我的电脑上有相同版本的 mysql,它可以使用该格式存储值。
  • 您的 VPS 运行的是哪个 mysql 版本,另外,您是手动插入值还是在某处使用带有接口的编程语言
  • @laurentiuskevin 这里的基本问题是FLOAT(18,2) 是一个有效但无意义的列定义。 FLOAT 数据类型只有 4 个字节可供使用,因此如果不四舍五入,就不一定能存储超过 6 个有效数字的数字。这里的异常是本地异常——VPS 的行为更像预期的那样。你不应该使用FLOATDOUBLE 除非你有特定的理由这样做——也就是说,“几乎从不”——如果你不确定你是否有这样的理由,那么你没有这样的理由一个原因。使用DECIMAL
  • @Michael - sqlbot,有道理,谢谢
猜你喜欢
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2022-09-29
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
相关资源
最近更新 更多