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

⚡ 智能摘要

SAP HANA 数据类型定义了每一列可以存储的内容,涵盖日期时间、数值、布尔值、字符串、二进制、大型对象和多值分类,每个映射ping 存储到特定列类型。

  • 🗓️ 日期时间类型: DATE、TIME、SECONDDATE 和 TIMESTAMP 的区别在于它们保留的精度。
  • 🔢 数值范围: TINYINT 到 BIGINT 涵盖整数,而 DECIMAL、SMALLDECIMAL、REAL 和 DOUBLE 处理分数。
  • 🔤 字符串: VARCHAR 存储字节,NVARCHAR 存储 Unicode 字符,两者均限制为 5000 个字符。
  • 📦 大型物体: BLOB、CLOB、NCLOB、TEXT 和 BINTEXT 存储的数据太大,无法放入普通列中。
  • 🔍 已启用搜索功能: TEXT、BINTEXT 和 SHORTTEXT 支持全文搜索,但仅限于列式存储表。
  • ✍️ 标识符: 分隔符标识符位于双引号内,可接受任何字符;非分隔符标识符必须以字母开头。
  • ❝ 引用规则: 单引号用于分隔字符串值,双引号用于分隔标识符。

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;

导致转换问题最多的错误有以下四种:

  1. 数值溢出。 将 40000 插入 SMALLINT 类型失败,因为有符号范围止于 32,767。错误信息中提到的是列名而不是值,因此请先检查定义。
  2. 字符串截断。 加载长度超过声明长度的文本时,会引发错误而不是默默地将其截断。NVARCHAR 类型按字符数计数,VARCHAR 类型按字节数计数。
  3. 日期格式无效。 向 TO_DATE 函数传递格式错误的字符串会失败。请始终提供格式掩码,而不要依赖会话默认值。
  4. WHERE 子句中的隐式转换。 将字符列与数字列进行比较会强制对每一行进行转换,这会妨碍高效的筛选。应该转换常量而不是列。

这些滤波器中使用的比较符号在以下章节中有详细介绍: SAP HANA 操作员以及更广泛的平台 SAP HANA教程 系列丛书中。

常见问题

VARCHAR 的长度限制以字节为单位,而 NVARCHAR 的长度限制以 Unicode 字符为单位。对于任何可能包含非 ASCII 字符的文本,NVARCHAR 都是更稳妥的选择,因为它不会意外截断。

当精度达到二级即可满足大多数业务事件的需求时,请使用 SECONDDATE 类型。TIMESTAMP 类型会添加秒的小数部分,并且会在大型表的每一行上占用更多存储空间。

是的。分析源文件可以揭示实际的值范围、长度和格式,人工智能会据此为每一列提出最小的安全类型,而不是使用过大的默认值进行防御。

是的。将声明的长度与实际存储的值进行比较,可以突出显示可能缩短的列,这很重要,因为 HANA 表的每一列都保存在内存中。

TEXT、BINTEXT 和 SHORTTEXT 提供文本搜索功能。这三种功能都仅限于列式存储表,不能在行式存储表上定义。

总结一下这篇文章: