关于Oracle里面float(b)类型数据的说明

本文解析了Oracle中float类型的精度问题,特别是float(b)中b代表二进制精度而非十进制精度,并通过实例展示了如何正确理解float类型的存储方式。

因为平时一直用Number类型,今天看到别人的表里有float类型,而且还有个坑。所以实在要用float的话,保险的做法就是直接申明为float。

原文链接:http://jimmyhe1981.itpub.net/post/19858/130417

今天有人问我,他把字段类型设计成float(2)后,插入数据93.5,后,为什么变成了90?

为了说明这个问题,我们先来看一段话(http://www.cnoug.org/viewthread.php?tid=56643):Oracle Online Help 说:FLOAT(b) specifies a floating-point number with binary precision b. The precision b can range from 1 to 126. To convert from binary to decimal precision, multiply b by 0.30103。

根据这段话,我们可以看到,float(2)中的2是一个binary precision,而不是我们常用的decimal precision。他们之间的换算关系是:binary precision=int(b*0.30103),因此我们这里实际上的精度应该等于int(2*0.30103)=0,即小数点后精度为0。


回到我们原来的问题,93.5化成浮点型9.35*10^1,这时9.35小数点后精度为0,成9,因此最后变成9*10^1=90。

类似的,我们可以设计成float(10),那么int(10*0.30103)=3,因此,如果插入93.5,就得出9.35--精度为3-->9.350,9.350*10^1=93.5。如果插入13884.2,得出1.38842--精度为3-->1.388,1.388*10^4=13880。

我们可以从以下测试更加清楚的看到这样的换算规则。

Connected to Oracle9i Enterprise Edition Release 9.0.1.1.1 
Connected as aspire

SQL> 
SQL> CREATE TABLE hjm_float_test
2 (a FLOAT(2),
3 b FLOAT(10),
4 c FLOAT,
5 d NUMBER);

Table created

SQL> INSERT INTO hjm_float_test(a,b,c,d) VALUES(93.5,93.5,93.5,93.5);

1 row inserted

SQL> INSERT INTO hjm_float_test(a,b,c,d) VALUES(93.665,93.665,93.665,93.665);

1 row inserted

SQL> INSERT INTO hjm_float_test(a,b,c,d) VALUES(96.5,96.5,96.5,96.5);

1 row inserted

SQL> INSERT INTO hjm_float_test(a,b,c,d) VALUES(13884.2,13884.2,13884.2,13884.2);

1 row inserted

SQL> COMMIT;

Commit complete

SQL> SELECT * FROM hjm_float_test;

A B C D
---- ------------ -------------------------------------------------------------------------------- ----------
90 93.5 93.5 93.5
90 93.67 93.665 93.665
100 96.5 96.5 96.5
1000 13880 13884.2 13884.2

SQL> desc hjm_float_test;
Name Type Nullable Default Comments 
---- ------ -------- ------- -------- 
A FLOAT Y 
B FLOAT Y 
C FLOAT Y 
D NUMBER Y

SQL>

请特别注意的是,虽然我在设计表的时候设计成了float(2)、float(10),但是当我在desc表(代码最后7列)的时候却是看不到这样的设计结构的,这样的问题需要尤其引起注意!!

最后,让我们回顾一下,记住float(b)中的b是二进制的精度,他的换算规则是binary precision=int(b*0.30103)。


<think>首先,用户的问题是关于“B4数据字典中字段的类型定义”。我需要理解这个查询。用户提到了“B4数据字典”,这可能是一个特定的数据字典或系统的一部分。在提供的引用中,有一些关于数据字典的信息: - 引用[1]:讨论了在MyBatis中使用字典类型数据,通过自定义TypeHandler来处理字典类型。 - 引用[2]:关于Elasticsearch的字段映射,包括text、keyword等类型。 - 引用[3]:关于用Java生成Word版的数据字典。 - 引用[4]:关于Google Earth Engine中的数据类型,如栅格和矢量数据。 用户的问题具体是“我想查找B4数据字典中字段的类型定义”,所以“B4”可能是一个特定的系统、项目或数据库的标识。在引用中,没有直接提到“B4”,所以我需要基于上下文推断。 回顾系统级指令: - 所有行内数学表达式用$...$格式。 - 独立公式用$$...$$并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识。 用户可见层:回答结构清晰,逐步解决问题,保证真实可靠。 用户的问题似乎是关于查找“B4数据字典”的字段类型定义。既然引用中没有直接提到“B4”,我需要假设“B4”可能是一个错误或缩写,或者基于之前的上下文。但在这个消息中,没有之前的上下文,所以我应该基于提供的引用回答。 可能的解释: - “B4”可能是一个笔误或特定术语。在引用[3]中,提到了“数据字典”,但没有“B4”。引用[2]是关于Elasticsearch的字段映射,这类似于数据字典。 - 或许“B4”指的是一个特定的数据库或系统。在软件工程中,数据字典定义了数据库字段的类型和含义。 我应该聚焦在数据字典的字段类型定义上。参考引用: - 引用[1]:讨论了字典类型在MyBatis中的处理,包括自定义类型处理程序。这涉及到如何将字典对象映射到数据库字段。 - 引用[2]:详细描述了Elasticsearch中的字段类型,如text、keyword等,以及映射设置。 - 引用[3]:关于生成数据字典文档。 - 引用[4]:关于GEE中的数据类型,如栅格和矢量。 用户的问题指定了“B4数据字典”,但既然没有具体信息,我应该回答一般的数据字典字段类型定义。 结构化回答: 1. **解释数据字典**:简要说明数据字典是什么。 2. **字段类型定义**:描述常见的字段类型,如字符串、整数、日期等,并参考引用。 3. **如何查找**:建议如何查找特定系统中的字段类型定义,比如在数据库管理系统或文档中。 4. **基于引用**:如果可能,引用提供的材料。 从引用中提取相关信息: - 引用[1]:在MyBatis中,字典类型可以通过自定义TypeHandler处理。例如,一个字典字段可能映射到数据库中的字符串或整数类型。 - 引用[2]:Elasticsearch的字段类型包括text(用于全文搜索)、keyword(用于精确匹配)、date、long等。 - 引用[3]:生成数据字典可能涉及导出数据库元数据。 - 引用[4]:GEE中的数据类型如ee.Image(栅格)、ee.FeatureCollection(矢量)。 用户提到“B4”,可能是一个特定系统。假设“B4”是一个数据库或项目代号,我应该建议检查系统文档或查询数据库元数据。 在回答中,我需要生成相关问题。 最终回答结构: - 以清晰、逐步的方式回答。 - 使用中文。 - 添加引用标识。 - 生成相关问题。 回答大纲: 1. 介绍数据字典:数据字典是存储元数据的系统,定义数据库字段的属性,如名称、类型、描述等。 2. 字段类型定义:常见类型包括字符串、整数、浮点数、日期、布尔值等。在特定系统中,如Elasticsearch或MyBatis,类型可能不同。 - 参考引用[2]:Elasticsearch有text、keyword等类型。 - 参考引用[1]:在MyBatis中,字典类型可以自定义。 3. 如何查找在“B4数据字典”中:由于“B4”未指定,建议检查系统文档、数据库管理工具或查询元数据表。 4. 如果“B4”是一个错误,提供一般指导。 生成相关问题: 1. 数据字典中常见的字段类型有哪些? 2. 如何在特定数据库系统中查看字段类型定义? 3. 如何自定义数据字典类型处理程序? 确保LaTeX:用户的问题中没有数学表达式,所以可能不需要。但如果有,要正确格式。 现在,撰写回答。</think>### B4 数据字典中字段类型定义的查找指南 数据字典是数据库或系统中存储元数据的核心组件,它定义了字段的名称、类型、描述等属性。针对您查询的“B4数据字典”,我理解这可能是一个特定系统或项目的内部标识(例如数据库表、应用程序模块或自定义数据字典)。由于您未提供“B4”的更多上下文(如所属系统或项目),我将基于通用数据字典原理和提供的参考引用,逐步指导您如何查找字段类型定义。以下内容基于真实数据库和系统实践,确保可靠性。 #### 步骤1: 理解数据字典和字段类型定义 - **数据字典的作用**:数据字典是元数据存储库,用于描述数据库表、字段、约束等信息。字段类型定义指定了数据的存储格式和验证规则,例如字符串、整数、日期等[^3]。 - **常见字段类型**(通用标准): - **字符串类型**:如 `VARCHAR`、`TEXT`,用于存储文本数据(例如用户名、描述)。 - **数值类型**:如 `INT`(整数)、`FLOAT`(浮点数),用于数值计算。 - **日期/时间类型**:如 `DATE`、`TIMESTAMP`,用于存储时间信息。 - **布尔类型**:如 `BOOLEAN`,用于真/假值。 - **自定义类型**:在某些系统中(如MyBatis或Elasticsearch),字段类型可以扩展为字典类型或枚举,例如将状态字段映射为字典值(如“0: 启用, 1: 禁用”)[^1][^2]。 - **在特定系统中的差异**: - 在 **Elasticsearch** 中,字段类型包括 `text`(全文搜索)、`keyword`(精确匹配)、`date` 等,映射规则可通过 `_mapping` API 查看[^2]。 - 在 **MyBatis** 等ORM框架中,字段类型可通过自定义 `TypeHandler` 处理字典数据,例如将数据库字段映射到Java枚举对象[^1]。 - 在 **Google Earth Engine (GEE)** 中,数据类型包括栅格(如 `ee.Image`)和矢量(如 `ee.FeatureCollection`),但这不是传统数据库字段类型[^4]。 #### 步骤2: 如何查找“B4数据字典”的字段类型定义 由于“B4”可能是特定标识(如数据库表名、项目代号或系统模块),我建议以下方法逐步查找。这些方法基于数据库管理和系统文档实践: 1. **检查系统文档或元数据表**: - 大多数数据库系统(如MySQL、Oracle)提供内置表来存储数据字典信息。例如: - 在 **MySQL** 中,查询 `INFORMATION_SCHEMA.COLUMNS` 表: ```sql SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'B4'; ``` 这将返回“B4”表的所有字段名称、数据类型(如 `INT`、`VARCHAR`)和描述。 - 在 **Oracle** 中,使用 `ALL_TAB_COLUMNS` 视图类似查询[^3]。 - 如果“B4”是自定义数据字典(如应用程序中的字典表),查找其定义文件或配置(如XML、JSON文件)。例如,在MyBatis项目中,字典类型通常在 `TypeHandler` 实现中定义[^1]。 2. **使用数据库管理工具**: - 工具如 **MySQL Workbench**、**DBeaver** 或 **PowerDesigner** 可以可视化数据字典。连接到数据库后,浏览“B4”表的结构,直接查看字段类型。 - 如果“B4”是Elasticsearch索引,使用Kibana或命令行查询映射: ```bash GET /B4_index_name/_mapping ``` 这将输出字段类型定义,如 `"field1": { "type": "keyword" }`[^2]。 3. **生成数据字典文档**: - 如果“B4”需要导出为文档(如Word版),参考Java工具方法。例如,使用JDBC元数据API生成报告: ```java // 示例Java代码:获取字段类型 DatabaseMetaData metaData = connection.getMetaData(); ResultSet columns = metaData.getColumns(null, null, "B4", null); while (columns.next()) { String columnName = columns.getString("COLUMN_NAME"); String dataType = columns.getString("TYPE_NAME"); System.out.println(columnName + ": " + dataType); } ``` 这可以输出“B4”的所有字段类型定义[^3]。 4. **处理“B4”未找到的情况**: - 如果“B4”不是有效标识,检查拼写错误或上下文。例如,“B4”可能是表名缩写(如“base_table4”)。建议: - 列出所有表:`SHOW TABLES LIKE '%B4%';`(在SQL中)。 - 或查询系统元数据:如Elasticsearch的 `GET /_cat/indices`[^2]。 #### 注意事项 - **真实可靠性**:以上方法基于标准数据库实践。如果“B4”是特定项目(如内部系统),请提供更多细节(如数据类型或项目文档),我可以进一步优化建议。 - **性能与优化**:查询元数据表通常是高效的,但如果数据量大,避免在生产环境频繁操作[^2][^3]。 ### 相关问题 基于您的查询,以下是可能的相关问题: 1. 数据字典中常见的字段类型有哪些?它们在数据库设计中的作用是什么? 2. 如何在Elasticsearch或MyBatis中自定义字段类型映射? 3. 如果“B4”数据字典不存在,如何创建或修复缺失的元数据? 4. 生成Word版数据字典的工具有哪些推荐?如何自动化这个过程? 如果您有“B4”的更多上下文(如所属系统或错误消息),我可以提供更精准的指导!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值