您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

NULL 值装载

插入 NULL 值最方便的方法是在输入文件中使用 NULL 字节并在 WITH NULL BYTE 语句的列规范中指定 LOAD TABLE

这通过使用 "x00" 或 "x01" 终止输入文件中的每个数据字段来完成。

使用 "x01" 终止输入文件中的数据字段指示装载将 NULL 插入相应列。例如:

create table d1 ( c1 date );

load table d1 ( c1 binary with null byte ) from 'filename' quotes off escapes off format binary;

如果装载输入文件的内容是 000b32cb00000b32cc00,则两行将装载到表中。第一行是 2009 年 5 月 7 日,第二行是 2009 年 5 月 8 日。NULL 字节添加到输入文件中每个二进制日期之后。如果要将 NULL 值装载到第一行中,请在输入文件中将 NULL 字节的值更改为 "x01"。

000b32cb01000b32cc00

再例如,若要将值 32769 装载到 NUMERIC(20) 列中,输入文件应包含:

0x0102 0x5000 0x0ad1 0x0003 0x0000 0x00

这包括 NULL 字节。

要将 23456789012345678.12 装载到以 NUMERIC(19,2) 定义的列中,装载输入文件应包含:

0x0106 0x4f00 0x04b0 0x162e 0x04d2 0x1ed2 0x0d80 0x0002 0x0000 0x00

数字后跟 NULL 字节 (0x00)。

在表示该数值数量的结构的数字数组中,有七个无符号短型值(编号 0 - 6)。"digits[0]" 包含重要性最低的数字:

digits[0] = 0x04b0 (decimal 120)

digits[1] = 0x162e (decimal 5678)

digits[2] = 0x04d2 (decimal 1234)

digits[3] = 0x1ed2 (decimal 7890)

digits[4] = 0x0d80 (decimal 3456)

digits[5] = 0x0002 (decimal 2)

digits[6] = 0x0000

装载到表列中时,列规范的 NULL 部分指示如何将某些输入值视为 NULL 值。这些字符可能包括 BLANKS、ZEROS 或您定义的任何其它文字列表。当指定空值或从源文件读取空值时,目标列必须能够包含 NULL

ZEROS 的含义如下:

  • 如果输入数据均为二进制零(而不是字符零),则将列设置为 NULL

  • 如果输入数据为字符零,则: NULL(ZEROS) 永远不会导致列变为 NULLNULL('0') 导致列变为 NULL。例如,装载: CREATE TABLE t1 ( c1 INT, c2 INT );查看使用 big-endian 字节排序的输入数据文件:od -x data.inp3030 3030 0000 04d2执行:LOAD TABLE t1 ( c1 ASCII(4) NULL( '0000' ), c2 BINARY )FROM 'data.inp' FORMAT BINARY QUOTES OFF ESCAPES OFF;结果:SELECT * FROM t1;c1 c2NULL 1234

  • NULL(ZEROS) 永远不会导致列变为 NULL

  • NULL('0') 导致列变为 NULL。例如,装载: CREATE TABLE t1 ( c1 INT, c2 INT );查看使用 big-endian 字节排序的输入数据文件:od -x data.inp3030 3030 0000 04d2执行:LOAD TABLE t1 ( c1 ASCII(4) NULL( '0000' ), c2 BINARY )FROM 'data.inp' FORMAT BINARY QUOTES OFF ESCAPES OFF;结果:SELECT * FROM t1;c1 c2NULL 1234

  • 如果输入数据为二进制零(清除所有位),则: NULL(ZEROS) 导致列变为 NULLNULL('0') 永远不会导致列变为 NULL,例如,装载: CREATE TABLE t1 ( c1 INT, C2 INT );查看使用 big-endian 字节排序的输入数据文件:od -x data.inp0000 0000 0000 04d2执行:LOAD TABLE t1 ( c1 ASCII(4) NULL( zeros ), c2 BINARY )FROM 'data.inp' FORMAT BINARY QUOTES OFF ESCAPES OFF;结果:SELECT * FROM T1;c1 c2NULL 1234再例如,如果 LOAD TABLE 语句包含 col1 date( 'yymmdd' ) null(zeros) 并且要装载的数据为 000000,您会收到一个错误,指示 000000 无法转换为 DATE(4)。若要使 LOAD TABLE 在数据为 000000 时在 col1 中插入空值,请将 NULL 子句编写为 null('000000'),或将数据修改为相同数目的二进制零并使用 NULL(ZEROS)。

  • NULL(ZEROS) 导致列变为 NULL

  • NULL('0') 永远不会导致列变为 NULL,例如,装载: CREATE TABLE t1 ( c1 INT, C2 INT );查看使用 big-endian 字节排序的输入数据文件:od -x data.inp0000 0000 0000 04d2执行:LOAD TABLE t1 ( c1 ASCII(4) NULL( zeros ), c2 BINARY )FROM 'data.inp' FORMAT BINARY QUOTES OFF ESCAPES OFF;结果:SELECT * FROM T1;c1 c2NULL 1234再例如,如果 LOAD TABLE 语句包含 col1 date( 'yymmdd' ) null(zeros) 并且要装载的数据为 000000,您会收到一个错误,指示 000000 无法转换为 DATE(4)。若要使 LOAD TABLE 在数据为 000000 时在 col1 中插入空值,请将 NULL 子句编写为 null('000000'),或将数据修改为相同数目的二进制零并使用 NULL(ZEROS)。

    在二进制装载过程中装载 NULL 值的另一种方法是,如果目标列接受空值,则不为 LOAD TABLE 语句中的列提供数据。例如:

    CREATE TABLE t1 ( c1 INT, c2 INT );
    

    LOAD TABLE T1 ( c2 BINARY ) FROM 'data.inp'

        FORMAT BINARY

        QUOTES OFF

        ESCAPES OFF;

    SELECT * FROM T1;

    c1     c2

    NULL   1234

    NULL   1234

    查看使用 big-endian 字节排序的输入数据文件:

    od -x data.inp
    

    0000 04d2 0000 04d2