SAP HANA 数据类型:数字、字符串、小数

在本 SAP HANA 数据类型教程,我们将学习:
1) SAP HANA 数据类型 – SAP HANA 数据类型包括日期时间、数字数据类型、布尔值、字符串、二进制数据类型等。
2) SAP HANA 标识符 – 分隔标识符和非分隔标识符
数据类型 SAP HANA
In SAP HANA 数据库, SQL 数据类型如下:
| 分类 | 子分类 | SQL 数据类型 | 列存储类型 | 默认格式 |
|---|---|---|---|---|
| 日期时间类型 | 日期 | 日期 | CS_DAYDATE | '年-月-日' |
| 时间 | 时间 | CS_SECONDTIME | 'HH24:MI:SS' | |
| 第二次约会 | 第二次约会 | CS_LONGDATE | 'YYYY-MM-DD HH24:MI:SS' | |
| 时间戳 | TIMESTAMP | CS_SECONDDATE | 'YYYY-MM-DD HH24:MI:SS.FFn' | |
| 数字类型 | 微小整数 | 微信 | CS_INT | 8 位无符号整数,范围 0 到 255 |
| 小整数 | 小灵通 | CS_INT | 16 位有符号整数,范围 -32,768 至 32,767 | |
| 整数 | INTEGER | CS_INT | 32 位有符号整数,范围 -2,147,483,648 至 2,147,483,647 | |
| 大整数 | 大数据 | CS_FIXED(18,0) | 64 位有符号整数,范围 -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 | |
| 十进制 | DECIMAL(p,s) p-精度 s 尺度 |
CS_FIXED(ps,s) | 精度 p 的范围是 1 到 38。 尺度 s 的范围可以从 0 到 p SAP HANA 十进制数据类型。 如果未指定精度和小数位数,则 DECIMAL 将成为浮点十进制数。 |
|
| 小数 | 小数 | CS_SDFLOAT | 浮点小数,精度和小数位数根据存储的值不同,精度在1~16范围内,小数位数在-369~368范围内。SMALLDECIMAL仅支持列存表。 | |
| 实数 | REAL | CS_FLOAT | 单精度 32 位浮点数 | |
| Double 联系电话 | 双盒套装 | CS_DOUBLE | 双精度 64 位浮点数 | |
| Float | 浮点数(n) | CS_DOUBLE | 这是一个32位或64位实数。其中n指定位数,取值范围应在1到53之间。 | |
| 布尔 | 布尔 | 布尔 | CS_INT | 真、假和未知 (NULL)。 |
| 字符串 | 可变长度字符串 | VARCHAR(n)的 | CS_字符串 | 此 HANA 字符串长度数据类型为可变长度字符串,其中“n”指定以字节为单位的最大长度,这是一个介于 1 和 5000 之间的整数。 |
| 可变长度 Unicode 字符 | NVARCHAR(n) | CS_字符串 | 可变长度的 Unicode 字符集字符串,其中表示最大字符长度,为 1 至 5000 之间的整数 | |
| 字母数字字符 | 字母表(n) | CS_ALPHANUM 键 | 可变长度的字母数字字符,其中 n 表示最大长度,是 1 到 127 之间的整数 | |
| 短文本 | 短文本(n) | CS_字符串 | 它是一种可变长度字符串,提供文本搜索和字符串搜索功能。这种数据类型可以定义在列式存储表中,但不能定义在行式存储表中。 | |
| 二进制类型 | 二进制文本 | VARBINARY(n) | CS_RAW | 存储指定最大长度(以字节为单位)的二进制数据,其中 n 表示最大长度,是 1 至 5000 之间的整数。 |
| LOB 类型(大对象类型) | 二进制 LOB | BLOB | CS_RAW | 大量二进制数据 |
| 字符 LOB | CLOB | CS_字符串 | ASCII 字符数据 | |
| Unicode 字符 LOB | 大对象对象 | CS_字符串 | 大型 Unicode 字符对象 | |
| 文字 | 文字 | CS_字符串 | TEXT 数据类型提供文本搜索功能。此数据类型可以定义为列存储表,但不能定义为行存储表。 | |
| 二进制文本数据 | 宾语文本 | CS_字符串 | BINTEXT 数据类型与 TEXT 数据类型类似,因此支持文本搜索功能,但可以插入二进制数据。此数据类型可以定义用于列表,但不能定义用于行表。 | |
| 多值类型 | 排列 | ARRAY | 它存储相同数据类型的值的集合,其中每个元素都与一个位置相关。数组可以包含 NULL 值,表示没有值。 |
选择正确的 SAP HANA 数据类型
上表列出了可供选择的选项。做出正确的选择至关重要。 SAP 与基于磁盘的数据库相比,HANA 存在诸多问题,因为每一列都驻留在内存中,而过大的类型会在每一行上消耗稀缺资源。
大部分决策都遵循以下四条规则:
- 选择最小的、合适的数值类型。 一个具有五个可能值的状态标志需要使用 TINYINT 类型,而不是 INTEGER 类型。对于包含十亿行数据的表来说,这会导致内存占用增加数 GB。
- 永远不要把钱存在实体店或银行账户里。 浮点数无法精确表示小数部分,因此总数会存在货币单位的小数部分偏差。请使用显式指定精度和小数位数的 DECIMAL 类型。
- 优先选择 NVARCHAR 类型,而不是 VARCHAR 类型。 VARCHAR 按字节计数,而 NVARCHAR 按字符计数,因此任何非 ASCII 文本在 VARCHAR 中都会意外截断。 SAP 正是出于这个原因,HANA 版本将 VARCHAR 视为 NVARCHAR。
- 日期精度需符合要求。 DATE 用于表示日历日期,SECONDDATE 用于表示具体时间,TIMESTAMP 仅用于真正需要亚秒级精度的情况。每次升级都会增加每行数据的存储空间。
大型对象类型需要特别注意。BLOB 或 NCLOB 列虽然方便但占用大量空间,而对 TEXT 或 SHORTTEXT 的文本搜索仅适用于列存储表,因此存储方式的选择与数据类型的选择是相互关联的。存储选项将在后续章节中介绍。 SAP HANA SQL 教程。
SAP HANA 标识符
标识符用于表示名称 SQL 语句(例如表名、视图名、列名、索引名、同义词名、过程名、函数名等)
有两种类型的标识符 SAP HANA:分隔标识符和非分隔标识符。
- 分隔标识符 – 它被括在分隔符中, Double 引号“”。标识符可以包含任何字符,包括特殊字符。
- 未分隔标识符 – 未分隔的标识符(表名、列名)必须以字母开头,并且不能包含除数字或下划线“_”之外的任何符号。
用于分隔的引号有两种类型,如下所示-
- 单引号 (' ') – 用于分隔字符串。
- Double 引号(“ “)– 用于分隔标识符。
⚠️警告: 创建对象时,未加分隔符的标识符会被转换为大写。例如,如果创建一个名为 employee 的表,之后又从名为“employee”(小写)的表中进行选择,则会失败,因为存储的名称是 EMPLOYEE。请完全避免使用双引号,或者始终如一地使用双引号。
数据类型转换和常见错误
SAP HANA 会自动在兼容类型之间进行转换,但隐式转换是导致结果错误和查询速度缓慢的根源。显式转换则能将转换意图清晰地表达出来。
这项工作由两个函数完成。CAST 将值转换为指定类型,而 TO_DATE、TO_VARCHAR、TO_DECIMAL 及其相关函数则可以使用可选的格式字符串进行转换。
-- Explicit conversion with CAST SELECT CAST('1234' AS INTEGER) FROM DUMMY; -- Conversion with an explicit format SELECT TO_DATE('2026-07-21', 'YYYY-MM-DD') FROM DUMMY; -- Number to string with fixed decimals SELECT TO_DECIMAL(1234.5678, 10, 2) FROM DUMMY;
导致转换问题最多的错误有以下四种:
- 数值溢出。 将 40000 插入 SMALLINT 类型失败,因为有符号范围止于 32,767。错误信息中提到的是列名而不是值,因此请先检查定义。
- 字符串截断。 加载长度超过声明长度的文本时,会引发错误而不是默默地将其截断。NVARCHAR 类型按字符数计数,VARCHAR 类型按字节数计数。
- 日期格式无效。 向 TO_DATE 函数传递格式错误的字符串会失败。请始终提供格式掩码,而不要依赖会话默认值。
- WHERE 子句中的隐式转换。 将字符列与数字列进行比较会强制对每一行进行转换,这会妨碍高效的筛选。应该转换常量而不是列。
这些滤波器中使用的比较符号在以下章节中有详细介绍: SAP HANA 操作员以及更广泛的平台 SAP HANA教程 系列丛书中。
