在 MySQL 命令行客户端中禁用科学计数法?

Posted

技术标签:

【中文标题】在 MySQL 命令行客户端中禁用科学计数法?【英文标题】:Disable scientific notation in MySQL command-line client? 【发布时间】:2012-02-29 05:10:20 【问题描述】:

我有一个 mysql 表,其中包含许多数字列(一些 INT,一些 FLOAT)。我想用 MySQL 命令行客户端(特别是 mysql Ver 14.14 Distrib 5.1.41, for debian-linux-gnu (x86_64) using readline 6.1)查询它,如下所示:

SELECT * FROM table WHERE foo;

很遗憾,如果任何数字字段的值超过 10^6,此客户端会以科学计数法显示结果,导致读取结果困难。

我可以通过格式化查询中的每个字段来纠正问题,但是其中有很多字段和我想查询的表。相反,我希望找到一个可以设置为禁用所有查询的科学记数法的客户端变量或标志。

我无法在--helpman 页面中找到一个,也无法搜索Google 或此站点。相反,我发现的只是在使用 <insert-programming-language> 的 MySQL API 时保留/删除科学记数法的讨论。

感谢您的任何提示。

::编辑::

这是一个示例表...

mysql> desc foo;
+--------------+-------------+------+-----+-------------------+
| Field        | Type        | Null | Key | Default           |
+--------------+-------------+------+-----+-------------------+
| date         | date        | NO   | PRI | NULL              |
| name         | varchar(20) | NO   | PRI | NULL              |
| val          | float       | NO   |     | NULL              |
| last_updated | timestamp   | NO   |     | CURRENT_TIMESTAMP |
+--------------+-------------+------+-----+-------------------+

还有一些示例值...

mysql> select * from foo where date='20120207';
+------------+--------+--------------+---------------------+
| date       | name   | val          | last_updated        |
+------------+--------+--------------+---------------------+
| 2012-02-07 | A      |      88779.5 | 2012-02-07 13:38:14 |
| 2012-02-07 | B      |  1.00254e+06 | 2012-02-07 13:38:14 |
| 2012-02-07 | C      |      78706.5 | 2012-02-07 13:38:15 |
+------------+--------+--------------+---------------------+

现在,我加载到第三个字段中的实际值是:

88779.5, 1002539.25, 78706.5390625

如果我操纵该值,它们可以准确地看到:

mysql> select date, name, ROUND(val, 10), last_updated from foo where ...
+------------+---+--------------------+---------------------+
| 2012-02-07 | A |   88779.5000000000 | 2012-02-07 13:38:14 |
| 2012-02-07 | B | 1002539.2500000000 | 2012-02-07 13:38:14 |
| 2012-02-07 | C |   78706.5390625000 | 2012-02-07 13:38:15 |

客户端中的某些东西似乎在强制我只能看到六个有效数字,即使表格中还有更多。

如果查询如

mysql> select ROUND(*, 2) from foo ...

有可能,那太好了!否则,当我需要检查一些数据时,我真的无法花时间在“ROUND()”中单独包装 100 个列名。

有趣的是,我偶尔会使用 phpMyAdmin 界面来浏览其中一些表格的内容,并且该界面也有这个 6 位有效数字的限制。所以它不仅限于 CLI。

【问题讨论】:

科学记数法的创建是为了使较大的十进制值更易于阅读。 我认为你在这里不走运。我不相信 CLI 会选择这样做。 @Ramhound 是的,但是当这些值与非科学计数法的值混合时,读取这些值会更困难。 你能举一个你正在使用的表格的例子吗?我正在使用这个:create table testLength( i int); 命令行客户端带回爆炸值似乎没有问题。 相关:***.com/questions/6077069/… 【参考方案1】:

好吧,在更彻底地阅读了文档之后,我仍然看不出为什么客户端会限制自己仅显示 FLOAT 中的 6 个 sig figs(尤其是当表本身肯定存储更多时)。

尽管如此,一个可接受的解决方案(对于这个疲惫的用户)是更改我的所有表以使用 DECIMAL(16,4) 而不是 FLOAT。不幸的是,这使我所有的数字都显示为小数点后 4 位(即使它们都是“0”)。但至少现在所有数字都具有相同的宽度,而且我的客户从不以科学计数法显示它们或限制其输出中 sig figs 的数量。

【讨论】:

【参考方案2】:

CAST 函数不允许您请求将某个字段的值作为 DECIMAL 返回吗?不是专家,也没有尝试过,但这是我尝试的第一件事。

【讨论】:

是的,这与任何其他按字段的建议一样好。然而,问题是如何避免使用任何逐字段操作来获得正确格式的结果。我希望能够编写 select * from foo ... 并且看不到任何科学记数法。【参考方案3】:

我知道这很旧,但这对我有帮助..我使用了一个视图..

create view foo2 as select date, name, ROUND(val, 10) val, last_updated from foo

然后在 foo2 上进行查询。也适用于 phpmyadmin

【讨论】:

谢谢。这不是一个糟糕的解决方案,但确实引入了 VIEW(这在 MySQL 中不是一件好事)。

以上是关于在 MySQL 命令行客户端中禁用科学计数法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spark-xml 中禁用科学计数法

在 Access 2007 CSV 导出中:禁用科学记数法

MySQL科学计数法展示解惑

MySQL科学计数法展示解惑

Pandas禁用科学计数和优化设置 | 让数据处理体验更爽

在 pandas .p​​lot() 函数中禁用科学记数法和偏移