数据类型 #
一、数据类型概述 #
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
├── 支持自动解引用
├── 支持双向导航
└── 删除时可选级联
4.2 LINKLIST #
链接列表:
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