oracle - Oracle 表中存储“隐藏”小数位的数字列
问题描述
这里的第一个问题,因为搜索这些术语太模糊了。我不知道数据是如何进入表格的(我认为只是通过“插入 tomtest(test) 值 (280.1);”但不能确定)但这个例子似乎很奇怪。为什么直接选择显示小数点后 1 位,而 to_char 选择显示小数点后 14 位?
SQL> set linesize 100
SQL> select banner from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE 12.2.0.1.0 Production
TNS for Linux: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production
SQL> describe tomtest
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
TEST NUMBER
SQL> select * from tomtest;
TEST
----------
280.1
SQL> select * from tomtest where test = 280.1;
no rows selected
SQL> select to_char(test) from tomtest;
TO_CHAR(TEST)
----------------------------------------
280.10000000000002
SQL> SELECT data_type, data_length, data_precision, data_scale FROM USER_TAB_COLS WHERE TABLE_NAME = 'TOMTEST' AND COLUMN_NAME = 'TEST';
DATA_TYPE DATA_LENGTH DATA_PRECISION DATA_SCALE
NUMBER 22
解决方案
原因是sql plus中默认的numberformat。在数据库中你有价值280.10000000000002
而不是280.1
这是一个例子
SQL> select 128.000000000000000000006 as test from dual;
test
-------------------------
128
SQL> select 128.200000000000000000006 as test from dual;
test
-------------------------
128,2
您可以更改数字格式并再次检查
SQL> SET NUMF 999999999.99999999999999999999999999999999
SQL> select 128.200000000000000000006 as test from dual;
test
-------------------------------------------
128.20000000000000000000600000000000
SQL>
更新: 这种现象可以解释为您的数据类型仅定义为数字,没有精确的精度规范。这意味着您可以保存小数,但不要给出小数位的确切说明。
这是一个显示差异的示例。
CREATE TABLE test_num(
n1 NUMBER,
n2 NUMBER(23,15));
INSERT INTO test_num VALUES(208.20000000000006,208.20000000000006);
SELECT t.*FROM test_num t;
在 PLSQL/Developer 中恢复:
N N2
--- ---
208,2 208,200000000000030
在 plsql Developer 中,您可以将数字显示为 char。如果您想激活首选项中的复选框:Tools -> Preferences -> SQL Window -> Number fields to_char
在您的情况下,我会在插入/更新时将一个数值四舍五入到一定的小数位,或者将您的数据类型从更改number
为number(p, s)
(其中 p 是精度,s 是比例。)
推荐阅读
- c# - Xamarin Forms Image 控件分配比请求更多的高度
- python - “ord() 需要一个字符,但是长度为 15 的字符串...”
- mongodb - 当 Wired Tiger 缓存利用率超过总缓存大小的 80% 时,Mongodb 写入性能下降
- python - 从另一个服务(微服务架构)验证 Flask 单元测试客户端?
- javascript - 在数组中查找特定项目?
- date - 如何从SAS中的日期中提取月份
- reactjs - Uncaught (in promise) SyntaxError: Unexpected end of JSON input Promise.then (async)
- c# - 在我的角色匹配后,我只想获得接下来的 5 个单词
- r - 如何将 0=..., 1=... 列转换为 1 个单列
- css - 按钮位置不断变化的位置