DATALINK 类型
DATALINK 类型用于存储指向文档 (例如 satge) 或文件链接的特殊数据类型。它的主要目的是在数据库中存储文档的链接地址,而不是存储文档本身。这种类型可以应用于各种场景,特别是在处理大规模文档管理时,提供对文档的快捷访问,而不需要将文档实际存储在数据库中。
使用 DATALINK 数据类型可以:
- 节省存储空间:文档实际存储在外部存储中(例如对象存储系统),而数据库只保存链接。
 - 方便的文档访问:通过存储链接,系统可以快速访问文档,无需额外的存储和处理。
 - 提高数据操作效率:避免了直接在数据库中处理大文件,提高了数据操作的速度和效率。
 
插入 DATALINK 类型数据
语法结构
INSERT INTO TABLE_NAME VALUES ('<file://<path>/<filename>>|<stage://<stage_name>/<path>/<file_name>>?<offset=xx>&<size=xxx>')
参数释义
| 参数 | 说明 | 
|---|---|
| file | 指向本地文件系统文件位置。 | 
| stage | 指向 stage 指向文件位置。 | 
| offset | 非必填。偏移量,表明读的内容的起点。 | 
| size | 非必填。指定读取内容的大小,单位为子节。 | 
读取 DATALINK 类型数据
如果要读 DATALINK 指向文件链接的数据,可以使用 load_file 函数。
Note
load_file() 函数以二进制模式读取文件,对于非文本文件(如图像、音频、视频等二进制格式文件),读取的内容将以原始字节流的形式返回,不会进行字符编码的转换。此外,由于在 UTF-8 编码中,中文字符通常占用 3 个字节,而英文字符只占用 1 个字节。因此,在指定文件的偏移量(offset)和读取大小(size)时,如果不考虑字符的字节数对齐,可能会导致中文字符被截断或无法正确读取,从而出现乱码。为了避免这种情况,需要根据字符编码正确换算 offset 和 size 的值,确保读取内容的字节数与字符的边界对齐。
示例
/Users/admin/case 下有文件 t1.csv
(base) admin@192 case % cat t1.csv 
this is a test message
drop table test01;
create table test01 (col1 int, col2 datalink);
create stage stage01 url='file:///Users/admin/case/';
insert into test01 values (1, 'file:///Users/admin/case/t1.csv');
insert into test01 values (2, 'file:///Users/admin/case/t1.csv?size=2');
insert into test01 values (3, 'file:///Users/admin/case/t1.csv?offset=4');
insert into test01 values (4, 'file:///Users/admin/case/t1.csv?offset=4&size=2');
insert into test01 values (5, 'stage://stage01/t1.csv');
insert into test01 values (6, 'stage://stage01/t1.csv?size=2');
insert into test01 values (7, 'stage://stage01/t1.csv?offset=4');
insert into test01 values (8, 'stage://stage01/t1.csv?offset=4&size=2');
mysql> select * from test01;
+------+-------------------------------------------------+
| col1 | col2                                            |
+------+-------------------------------------------------+
|    1 | file:///Users/admin/case/t1.csv                 |
|    2 | file:///Users/admin/case/t1.csv?size=2          |
|    3 | file:///Users/admin/case/t1.csv?offset=4        |
|    4 | file:///Users/admin/case/t1.csv?offset=4&size=2 |
|    5 | stage://stage01/t1.csv                          |
|    6 | stage://stage01/t1.csv?size=2                   |
|    7 | stage://stage01/t1.csv?offset=4                 |
|    8 | stage://stage01/t1.csv?offset=4&size=2          |
+------+-------------------------------------------------+
8 rows in set (0.01 sec)
mysql> select col1, load_file(col2) from test01;
+------+-------------------------+
| col1 | load_file(col2)         |
+------+-------------------------+
|    1 | this is a test message
 |
|    2 | th                      |
|    3 |  is a test message
     |
|    4 |  i                      |
|    5 | this is a test message
 |
|    6 | th                      |
|    7 |  is a test message
     |
|    8 |  i                      |
+------+-------------------------+
8 rows in set (0.01 sec)