数据类型 #

一、数据类型概述 #

1.1 类型分类 #

text
OrientDB数据类型:
├── 基本类型
│   ├── 数值类型
│   ├── 字符串类型
│   ├── 布尔类型
│   └── 日期时间类型
├── 集合类型
│   ├── LIST
│   ├── SET
│   └── MAP
├── 链接类型
│   ├── LINK
│   ├── LINKLIST
│   ├── LINKSET
│   └── LINKMAP
├── 嵌入类型
│   ├── EMBEDDED
│   ├── EMBEDDEDLIST
│   ├── EMBEDDEDSET
│   └── EMBEDDEDMAP
└── 特殊类型
    ├── BINARY
    └── DECIMAL

二、基本类型 #

2.1 数值类型 #

类型 范围 存储 示例
INTEGER -2^31 到 2^31-1 4字节 42, -100
LONG -2^63 到 2^63-1 8字节 9223372036854775807L
SHORT -32768 到 32767 2字节 1000S
BYTE -128 到 127 1字节 100B
FLOAT IEEE 754 4字节 3.14F
DOUBLE IEEE 754 8字节 3.14159265359
DECIMAL 任意精度 可变 12345.6789

2.2 数值类型使用 #

创建属性:

sql
CREATE CLASS Product
CREATE PROPERTY Product.id INTEGER
CREATE PROPERTY Product.price DECIMAL
CREATE PROPERTY Product.stock LONG
CREATE PROPERTY Product.discount FLOAT

插入数据:

sql
INSERT INTO Product SET 
    id = 1001,
    price = 99.99,
    stock = 10000L,
    discount = 0.15F

数值运算:

sql
SELECT id, price * (1 - discount) AS finalPrice FROM Product
SELECT id, ROUND(price, 2) AS roundedPrice FROM Product

2.3 字符串类型 #

类型 说明 最大长度
STRING 变长字符串 无限制

字符串操作:

sql
CREATE CLASS Person
CREATE PROPERTY Person.name STRING
CREATE PROPERTY Person.email STRING (NOTNULL, MANDATORY)

INSERT INTO Person SET name = 'Tom Hanks', email = 'tom@example.com'

字符串函数:

sql
SELECT 
    name,
    UPPER(name) AS upperName,
    LOWER(name) AS lowerName,
    LENGTH(name) AS nameLength,
    TRIM(name) AS trimmedName,
    SUBSTRING(name, 0, 3) AS shortName
FROM Person

2.4 布尔类型 #

类型 存储
BOOLEAN true, false 1字节

布尔操作:

sql
CREATE CLASS User
CREATE PROPERTY User.isActive BOOLEAN
CREATE PROPERTY User.isAdmin BOOLEAN

INSERT INTO User SET name = 'Tom', isActive = true, isAdmin = false

SELECT * FROM User WHERE isActive = true
SELECT * FROM User WHERE NOT isAdmin

2.5 日期时间类型 #

类型 格式 示例
DATE YYYY-MM-DD ‘2024-01-15’
DATETIME YYYY-MM-DD HH:MM:SS ‘2024-01-15 10:30:00’

日期操作:

sql
CREATE CLASS Event
CREATE PROPERTY Event.eventDate DATE
CREATE PROPERTY Event.createdAt DATETIME

INSERT INTO Event SET 
    name = 'Conference',
    eventDate = DATE('2024-06-15'),
    createdAt = DATETIME('2024-01-15 10:30:00')

日期函数:

sql
SELECT 
    name,
    eventDate,
    YEAR(eventDate) AS year,
    MONTH(eventDate) AS month,
    DAY(eventDate) AS day,
    SYSDATE() AS now
FROM Event

日期比较:

sql
SELECT * FROM Event WHERE eventDate > DATE('2024-01-01')
SELECT * FROM Event WHERE createdAt BETWEEN DATE('2024-01-01') AND DATE('2024-12-31')

三、集合类型 #

3.1 LIST(列表) #

有序可重复集合:

sql
CREATE CLASS Person
CREATE PROPERTY Person.hobbies LIST OF STRING

INSERT INTO Person SET name = 'Tom', hobbies = ['reading', 'coding', 'gaming']

SELECT name, hobbies[0] AS firstHobby FROM Person
SELECT name, hobbies FROM Person WHERE 'coding' IN hobbies

LIST操作:

sql
UPDATE Person ADD hobbies = 'swimming' WHERE name = 'Tom'
UPDATE Person REMOVE hobbies = 'gaming' WHERE name = 'Tom'
SELECT name, SIZE(hobbies) AS hobbyCount FROM Person

3.2 SET(集合) #

无序不重复集合:

sql
CREATE PROPERTY Person.tags SET OF STRING

INSERT INTO Person SET name = 'Tom', tags = {'developer', 'java', 'python'}

SELECT name, tags FROM Person WHERE 'java' IN tags

SET操作:

sql
UPDATE Person ADD tags = 'javascript' WHERE name = 'Tom'
UPDATE Person REMOVE tags = 'python' WHERE name = 'Tom'

3.3 MAP(映射) #

键值对集合:

sql
CREATE PROPERTY Person.preferences MAP OF STRING

INSERT INTO Person SET 
    name = 'Tom',
    preferences = {'theme': 'dark', 'language': 'en', 'timezone': 'UTC+8'}

SELECT name, preferences['theme'] AS theme FROM Person

MAP操作:

sql
UPDATE Person PUT preferences = 'fontSize', 'large' WHERE name = 'Tom'
UPDATE Person REMOVE preferences['timezone'] WHERE name = 'Tom'

3.4 集合类型对比 #

特性 LIST SET MAP
有序
重复 允许 不允许 键唯一
索引访问 支持 不支持 键访问
适用场景 有序列表 标签集合 配置项

四、链接类型 #

4.1 LINK(链接) #

指向单个记录的引用:

sql
CREATE CLASS Person EXTENDS V
CREATE CLASS Company EXTENDS V
CREATE PROPERTY Person.employer LINK Company

INSERT INTO Company SET name = 'ABC Corp'
INSERT INTO Person SET name = 'Tom', employer = (SELECT FROM Company WHERE name = 'ABC Corp')

SELECT name, employer.name AS companyName FROM Person

LINK特性:

text
LINK特点:
├── 存储目标记录的RID
├── 支持自动解引用
├── 支持双向导航
└── 删除时可选级联

链接列表:

sql
CREATE PROPERTY Person.friends LINKLIST OF Person

UPDATE Person ADD friends = (SELECT FROM Person WHERE name = 'Jerry') WHERE name = 'Tom'

SELECT name, friends.name AS friendNames FROM Person

4.3 LINKSET #

链接集合:

sql
CREATE PROPERTY Person.followers LINKSET OF Person

UPDATE Person ADD followers = (SELECT FROM Person WHERE name = 'Jerry') WHERE name = 'Tom'

SELECT name, SIZE(followers) AS followerCount FROM Person

4.4 LINKMAP #

链接映射:

sql
CREATE PROPERTY Person.projects LINKMAP OF Project

UPDATE Person PUT projects = 'main', (SELECT FROM Project WHERE name = 'Alpha') WHERE name = 'Tom'

SELECT name, projects['main'].name AS mainProject FROM Person

五、嵌入类型 #

5.1 EMBEDDED(嵌入文档) #

嵌入单个文档:

sql
CREATE CLASS Address
CREATE PROPERTY Address.street STRING
CREATE PROPERTY Address.city STRING
CREATE PROPERTY Address.zipCode STRING

CREATE CLASS Person
CREATE PROPERTY Person.address EMBEDDED Address

INSERT INTO Person SET 
    name = 'Tom',
    address = {'street': 'Main St', 'city': 'Beijing', 'zipCode': '100000'}

SELECT name, address.city FROM Person

EMBEDDED vs LINK:

特性 EMBEDDED LINK
存储 嵌入同一记录 存储RID引用
独立访问 不可以 可以
更新 需更新父记录 独立更新
性能 读取快 更新快

5.2 EMBEDDEDLIST #

嵌入文档列表:

sql
CREATE PROPERTY Person.phoneNumbers EMBEDDEDLIST

INSERT INTO Person SET 
    name = 'Tom',
    phoneNumbers = [
        {'type': 'home', 'number': '123-456-7890'},
        {'type': 'work', 'number': '098-765-4321'}
    ]

SELECT name, phoneNumbers[0].number AS homePhone FROM Person

5.3 EMBEDDEDSET #

嵌入文档集合:

sql
CREATE PROPERTY Person.skills EMBEDDEDSET

INSERT INTO Person SET 
    name = 'Tom',
    skills = {
        {'name': 'Java', 'level': 'expert'},
        {'name': 'Python', 'level': 'intermediate'}
    }

SELECT name, skills FROM Person

5.4 EMBEDDEDMAP #

嵌入文档映射:

sql
CREATE PROPERTY Person.settings EMBEDDEDMAP

INSERT INTO Person SET 
    name = 'Tom',
    settings = {
        'theme': 'dark',
        'language': 'en',
        'notifications': {'email': true, 'sms': false}
    }

SELECT name, settings['theme'] AS theme FROM Person

六、二进制类型 #

6.1 BINARY类型 #

存储二进制数据:

sql
CREATE CLASS Document
CREATE PROPERTY Document.content BINARY
CREATE PROPERTY Document.fileName STRING
CREATE PROPERTY Document.mimeType STRING

INSERT INTO Document SET 
    fileName = 'report.pdf',
    mimeType = 'application/pdf',
    content = '<binary_data>'

6.2 二进制操作 #

sql
SELECT fileName, LENGTH(content) AS fileSize FROM Document
SELECT FROM Document WHERE mimeType = 'application/pdf'

七、Record ID (RID) #

7.1 RID格式 #

text
格式: #<cluster-id>:<cluster-position>

示例:
#12:0  - 第12号集群的第0条记录
#12:1  - 第12号集群的第1条记录

7.2 RID操作 #

sql
SELECT FROM #12:0
SELECT @rid, name FROM Person
SELECT * FROM Person WHERE @rid = #12:0

7.3 RID函数 #

sql
SELECT RID(@this) FROM Person
SELECT FROM Person WHERE @rid IN [#12:0, #12:1, #12:2]

八、类型转换 #

8.1 显式转换函数 #

函数 说明 示例
STRING() 转字符串 STRING(123)
INTEGER() 转整数 INTEGER(‘123’)
LONG() 转长整数 LONG(‘123456789’)
FLOAT() 转浮点 FLOAT(‘3.14’)
DOUBLE() 转双精度 DOUBLE(‘3.14159’)
BOOLEAN() 转布尔 BOOLEAN(‘true’)
DATE() 转日期 DATE(‘2024-01-15’)
DATETIME() 转日期时间 DATETIME(‘2024-01-15 10:30:00’)

8.2 类型转换示例 #

sql
SELECT STRING(age) AS ageString FROM Person
SELECT INTEGER('123') + 1 AS result
SELECT DATE('2024-01-15') AS dateValue
SELECT BOOLEAN('true') AS boolValue

8.3 自动类型转换 #

sql
SELECT 'Age: ' + age AS label FROM Person
SELECT age + ' years old' AS label FROM Person

九、NULL值处理 #

9.1 NULL特性 #

text
NULL特点:
├── 表示缺失或未知值
├── 与任何值比较都为NULL
├── 参与运算结果为NULL
└── 需要特殊处理

9.2 NULL相关函数 #

sql
SELECT COALESCE(nickname, name, 'Unknown') AS displayName FROM Person
SELECT IFNULL(email, 'N/A') AS emailDisplay FROM Person
SELECT NULLIF(score, 0) AS normalizedScore FROM Exam

9.3 NULL判断 #

sql
SELECT * FROM Person WHERE email IS NULL
SELECT * FROM Person WHERE email IS NOT NULL

十、类型约束 #

10.1 NOT NULL约束 #

sql
CREATE PROPERTY Person.email STRING (NOTNULL)

10.2 MANDATORY约束 #

sql
CREATE PROPERTY Person.name STRING (MANDATORY)

10.3 DEFAULT默认值 #

sql
CREATE PROPERTY Person.status STRING DEFAULT 'active'
CREATE PROPERTY Person.createdAt DATETIME DEFAULT sysdate()

10.4 最小最大值 #

sql
CREATE PROPERTY Person.age INTEGER (MIN 0, MAX 150)
CREATE PROPERTY Person.score INTEGER (MIN 0, MAX 100)

10.5 正则表达式约束 #

sql
CREATE PROPERTY Person.email STRING (REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$')

十一、类型检查 #

11.1 检查属性类型 #

sql
SELECT name, @class, @type FROM Person
SELECT properties FROM metadata:schema WHERE name = 'Person'

11.2 类型判断函数 #

sql
SELECT name, 
    CASE 
        WHEN age IS NULL THEN 'NULL'
        WHEN typeof(age) = 'INTEGER' THEN 'INTEGER'
        ELSE 'OTHER'
    END AS ageType
FROM Person

十二、类型最佳实践 #

12.1 选择合适类型 #

场景 推荐类型
主键 STRING 或 INTEGER
金额 DECIMAL
数量 INTEGER 或 LONG
百分比 DECIMAL 或 FLOAT
标签 SET OF STRING
有序列表 LIST
配置项 MAP
地址 EMBEDDED
关联实体 LINK

12.2 性能考虑 #

text
性能建议:
├── 使用最小够用的类型
├── EMBEDDED适合频繁一起读取的数据
├── LINK适合独立更新的数据
├── SET比LIST更适合去重场景
└── 避免过深的嵌套结构

12.3 存储优化 #

text
存储优化:
├── 使用合适的数值类型
├── 压缩长字符串
├── 合理使用EMBEDDED减少JOIN
└── 避免存储冗余数据

十三、总结 #

数据类型要点:

类别 要点
基本类型 选择合适精度的数值类型
集合类型 根据有序性和唯一性选择
链接类型 理解LINK与EMBEDDED区别
约束 使用约束保证数据完整性

下一步,让我们学习数据库与类操作!

最后更新:2026-03-27