> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> TabSeparated 格式的文档

# TabSeparated

| 输入 | 输出 | 别名    |
| -- | -- | ----- |
| ✔  | ✔  | `TSV` |

<div id="description">
  ## 说明
</div>

在 TabSeparated 格式中，数据按行写入。每一行都包含由制表符分隔的值。除每行最后一个值后跟的是换行符外，其他每个值后面都跟一个制表符。全文统一严格使用 Unix 换行符。最后一行末尾也必须包含换行符。值以文本格式写入，不加引号，特殊字符会被转义。

该格式也可称为 `TSV`。

`TabSeparated` 格式便于使用自定义程序和脚本处理数据。它是 HTTP 接口以及命令行客户端批次模式的默认格式。该格式还支持在不同的 DBMS 之间传输数据。例如，你可以从 MySQL 获取转储并上传到 ClickHouse，反之亦然。

`TabSeparated` 格式支持输出总计值 (使用 WITH TOTALS 时) 和极值 (当 'extremes' 设置为 1 时) 。在这些情况下，总计值和极值会在主数据之后输出。主结果、总计值和极值之间以空行分隔。示例：

```sql theme={null}
SELECT EventDate, count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT TabSeparated

2014-03-17      1406958
2014-03-18      1383658
2014-03-19      1405797
2014-03-20      1353623
2014-03-21      1245779
2014-03-22      1031592
2014-03-23      1046491

1970-01-01      8873898

2014-03-17      1031592
2014-03-23      1406958
```

<div id="tabseparated-data-formatting">
  ## 数据格式化
</div>

整数以十进制形式写入。数字开头可以带一个额外的 "+" 字符 (解析时会被忽略，格式化时不会保留) 。非负数不能包含负号。读取时，允许将空字符串解析为零，或者 (对于有符号类型) 将仅包含一个负号的字符串解析为零。超出相应数据类型范围的数字，可能会被解析成另一个数字，且不会报错。

浮点数以十进制形式写入。使用点号作为小数分隔符。支持指数表示法，也支持 'inf'、'+inf'、'-inf' 和 'nan'。浮点数可以以小数点开头或结尾。
格式化时，浮点数可能会损失精度。
解析时，不严格要求读取最接近机器可表示值的数。

日期以 YYYY-MM-DD 格式写入，并按相同格式解析，但分隔符可以是任意字符。
带时间的日期以 `YYYY-MM-DD hh:mm:ss` 格式写入，并按相同格式解析，但分隔符可以是任意字符。
这些操作都基于客户端或服务器启动时的系统时区 (取决于由哪一方格式化数据) 。对于带时间的日期，夏令时未作规定。因此，如果某个转储包含夏令时期间的时间，则该转储无法与数据形成唯一对应关系，解析时会在两个时间中选取一个。
读取时，错误的日期和带时间的日期可能按自然溢出方式解析，或者被解析为空日期和时间，且不会报错。

例外情况下，如果带时间的日期恰好由 10 位十进制数字组成，也支持按 Unix 时间戳格式解析。结果不受时区影响。格式 `YYYY-MM-DD hh:mm:ss` 和 `NNNNNNNNNN` 会自动区分。

String 输出时，特殊字符会使用反斜杠转义。输出使用以下转义序列：`\b`、`\f`、`\r`、`\n`、`\t`、`\0`、`\'`、`\\`。解析时还支持 `\a`、`\v` 和 `\xHH` (十六进制转义序列) ，以及任意 `\c` 序列，其中 `c` 可以是任意字符 (这些序列会被转换为 `c`) 。因此，读取数据时支持以下格式：换行既可以写成 `\n`、`\`，也可以直接写成换行符。例如，字符串 `Hello world` 如果单词之间不是空格而是换行符，则可以按以下任一形式解析：

```text theme={null}
Hello\nworld

Hello\
world
```

之所以支持第二种变体，是因为 MySQL 在写入制表符分隔的转储时会使用它。

以 TabSeparated 格式传递数据时，至少需要转义以下字符：制表符、换行符 (LF) 和反斜杠。

只有少量符号会被转义。你很容易遇到某个字符串值，在输出时被终端破坏。

数组写作 `[]` 中以逗号分隔的值列表。数组中的数值项按常规方式格式化。`Date` 和 `DateTime` 类型用单引号括起来。String 也用单引号括起来，并遵循与上述相同的转义规则。

[NULL](/docs/zh/reference/syntax) 的格式由设置 [format\_tsv\_null\_representation](/docs/zh/reference/settings/formats#format_tsv_null_representation) 决定 (默认值为 `\N`) 。

在输入数据中，ENUM 值可以表示为名称或 id。首先，我们会尝试将输入值与 ENUM 名称匹配。如果失败，且输入值是数字，则会尝试将该数字与 ENUM id 匹配。
如果输入数据只包含 ENUM id，建议启用设置 [input\_format\_tsv\_enum\_as\_number](/docs/zh/reference/settings/formats#input_format_tsv_enum_as_number) 以优化 ENUM 解析。

[Nested](/docs/zh/reference/data-types/nested-data-structures/index) 结构中的每个元素都表示为数组。

例如：

```sql theme={null}
CREATE TABLE nestedt
(
    `id` UInt8,
    `aux` Nested(
        a UInt8,
        b String
    )
)
ENGINE = TinyLog
```

```sql theme={null}
INSERT INTO nestedt VALUES ( 1, [1], ['a'])
```

```sql theme={null}
SELECT * FROM nestedt FORMAT TSV
```

```response theme={null}
1  [1]    ['a']
```

<div id="example-usage">
  ## 示例用法
</div>

<div id="inserting-data">
  ### 插入数据
</div>

使用下面这个名为 `football.tsv` 的 TSV 文件：

```tsv theme={null}
2022-04-30      2021    Sutton United   Bradford City   1       4
2022-04-30      2021    Swindon Town    Barrow  2       1
2022-04-30      2021    Tranmere Rovers Oldham Athletic 2       0
2022-05-02      2021    Port Vale       Newport County  1       2
2022-05-02      2021    Salford City    Mansfield Town  2       2
2022-05-07      2021    Barrow  Northampton Town        1       3
2022-05-07      2021    Bradford City   Carlisle United 2       0
2022-05-07      2021    Bristol Rovers  Scunthorpe United       7       0
2022-05-07      2021    Exeter City     Port Vale       0       1
2022-05-07      2021    Harrogate Town A.F.C.   Sutton United   0       2
2022-05-07      2021    Hartlepool United       Colchester United       0       2
2022-05-07      2021    Leyton Orient   Tranmere Rovers 0       1
2022-05-07      2021    Mansfield Town  Forest Green Rovers     2       2
2022-05-07      2021    Newport County  Rochdale        0       2
2022-05-07      2021    Oldham Athletic Crawley Town    3       3
2022-05-07      2021    Stevenage Borough       Salford City    4       2
2022-05-07      2021    Walsall Swindon Town    0       3
```

插入数据：

```sql theme={null}
INSERT INTO football FROM INFILE 'football.tsv' FORMAT TabSeparated;
```

<div id="reading-data">
  ### 读取数据
</div>

使用 `TabSeparated` 格式读取数据：

```sql theme={null}
SELECT *
FROM football
FORMAT TabSeparated
```

输出将采用制表符分隔的格式：

```tsv theme={null}
2022-04-30      2021    Sutton United   Bradford City   1       4
2022-04-30      2021    Swindon Town    Barrow  2       1
2022-04-30      2021    Tranmere Rovers Oldham Athletic 2       0
2022-05-02      2021    Port Vale       Newport County  1       2
2022-05-02      2021    Salford City    Mansfield Town  2       2
2022-05-07      2021    Barrow  Northampton Town        1       3
2022-05-07      2021    Bradford City   Carlisle United 2       0
2022-05-07      2021    Bristol Rovers  Scunthorpe United       7       0
2022-05-07      2021    Exeter City     Port Vale       0       1
2022-05-07      2021    Harrogate Town A.F.C.   Sutton United   0       2
2022-05-07      2021    Hartlepool United       Colchester United       0       2
2022-05-07      2021    Leyton Orient   Tranmere Rovers 0       1
2022-05-07      2021    Mansfield Town  Forest Green Rovers     2       2
2022-05-07      2021    Newport County  Rochdale        0       2
2022-05-07      2021    Oldham Athletic Crawley Town    3       3
2022-05-07      2021    Stevenage Borough       Salford City    4       2
2022-05-07      2021    Walsall Swindon Town    0       3
```

<div id="format-settings">
  ## 格式设置
</div>

| 设置                                                                                                                                            | 说明                                                                                                                                                            | 默认值     |
| --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
| [`format_tsv_null_representation`](/docs/zh/reference/settings/formats#format_tsv_null_representation)                                             | TSV 格式中的自定义 NULL 表示形式。                                                                                                                                        | `\N`    |
| [`input_format_tsv_empty_as_default`](/docs/zh/reference/settings/formats#input_format_tsv_empty_as_default)                                       | 将 TSV 输入中的空字段视为默认值。对于复杂的默认表达式，还必须启用 [input\_format\_defaults\_for\_omitted\_fields](/docs/zh/reference/settings/formats#input_format_defaults_for_omitted_fields)。 | `false` |
| [`input_format_tsv_enum_as_number`](/docs/zh/reference/settings/formats#input_format_tsv_enum_as_number)                                           | 将 TSV 格式中插入的枚举值视为枚举索引。                                                                                                                                        | `false` |
| [`input_format_tsv_use_best_effort_in_schema_inference`](/docs/zh/reference/settings/formats#input_format_tsv_use_best_effort_in_schema_inference) | 使用一些调整和启发式方法来推断 TSV 格式中的 schema。若禁用，所有字段都将被推断为 String。                                                                                                        | `true`  |
| [`output_format_tsv_crlf_end_of_line`](/docs/zh/reference/settings/formats#output_format_tsv_crlf_end_of_line)                                     | 如果设置为 true，TSV 输出格式中的行尾将使用 `\r\n` 而不是 `\n`。                                                                                                                   | `false` |
| [`input_format_tsv_crlf_end_of_line`](/docs/zh/reference/settings/formats#input_format_tsv_crlf_end_of_line)                                       | 如果设置为 true，TSV 输入格式中的行尾将使用 `\r\n` 而不是 `\n`。                                                                                                                   | `false` |
| [`input_format_tsv_skip_first_lines`](/docs/zh/reference/settings/formats#input_format_tsv_skip_first_lines)                                       | 跳过数据开头指定数量的行。                                                                                                                                                 | `0`     |
| [`input_format_tsv_detect_header`](/docs/zh/reference/settings/formats#input_format_tsv_detect_header)                                             | 自动检测 TSV 格式中包含名称和类型的表头。                                                                                                                                       | `true`  |
| [`input_format_tsv_skip_trailing_empty_lines`](/docs/zh/reference/settings/formats#input_format_tsv_skip_trailing_empty_lines)                     | 跳过数据末尾的空行。                                                                                                                                                    | `false` |
| [`input_format_tsv_allow_variable_number_of_columns`](/docs/zh/reference/settings/formats#input_format_tsv_allow_variable_number_of_columns)       | 允许 TSV 格式中的列数可变，忽略多余的列，并为缺失的列使用默认值。                                                                                                                           | `false` |
