> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> 允许 ClickHouse 通过 ODBC 连接外部数据库。

# ODBC 表引擎

export const CloudNotSupportedBadge = () => {
  return <div className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            Not supported in ClickHouse Cloud
        </div>;
};

允许 ClickHouse 通过 [ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity) 连接到外部数据库。

为安全实现 ODBC 连接，ClickHouse 使用单独的程序 `clickhouse-odbc-bridge`。如果直接从 `clickhouse-server` 加载 ODBC 驱动程序，驱动程序问题可能会导致 ClickHouse 服务器崩溃。ClickHouse 会在需要时自动启动 `clickhouse-odbc-bridge`。ODBC bridge 程序与 `clickhouse-server` 安装在同一个软件包中。

此引擎支持 [Nullable](/zh/reference/data-types/nullable) 数据类型。

<div id="creating-a-table">
  ## 创建表
</div>

```sql theme={null}
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1],
    name2 [type2],
    ...
)
ENGINE = ODBC(datasource, external_database, external_table)
```

请参阅 [CREATE TABLE](/zh/reference/statements/create/table) 查询的详细说明。

表结构可以与源表的结构不同：

* 列名应与源表中的列名一致，但你也可以只使用其中部分列，且顺序可以任意。
* 列类型可以与源表中的列类型不同。ClickHouse 会尝试将值[转换](/zh/reference/functions/regular-functions/type-conversion-functions#CAST)为 ClickHouse 数据类型。
* [external\_table\_functions\_use\_nulls](/zh/reference/settings/session-settings#external_table_functions_use_nulls) 设置定义了如何处理 Nullable 列。默认值：1。如果为 0，表函数不会生成 Nullable 列，而是插入默认值来代替 null。这同样适用于数组中的 NULL 值。

**引擎参数**

* `datasource` — `odbc.ini` 文件中包含连接设置的节名称。
* `external_database` — 外部 DBMS 中数据库的名称。
* `external_table` — `external_database` 中表的名称。

这些参数也可以通过[命名集合](/zh/concepts/features/configuration/server-config/named-collections)传递。

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

**通过 ODBC 从本地安装的 MySQL 中读取数据**

此示例已在 Ubuntu Linux 18.04 和 MySQL 服务器 5.7 上验证。

请确保已安装 unixODBC 和 MySQL Connector。

默认情况下 (如果通过软件包安装) ，ClickHouse 会以 `clickhouse` 用户身份启动。因此，你需要在 MySQL 服务器中创建并配置该用户。

```bash theme={null}
$ sudo mysql
```

```sql theme={null}
mysql> CREATE USER 'clickhouse'@'localhost' IDENTIFIED BY 'clickhouse';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'clickhouse'@'localhost' WITH GRANT OPTION;
```

然后在 `/etc/odbc.ini` 中配置该连接。

```bash theme={null}
$ cat /etc/odbc.ini
[mysqlconn]
DRIVER = /usr/local/lib/libmyodbc5w.so
SERVER = 127.0.0.1
PORT = 3306
DATABASE = test
USER = clickhouse
PASSWORD = clickhouse
```

您可以使用 unixODBC 安装包中的 `isql` 工具来检查连接。

```bash theme={null}
$ isql -v mysqlconn
+-------------------------+
| Connected!                            |
|                                       |
...
```

MySQL 中的表：

```text theme={null}
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0,01 sec)

mysql> CREATE TABLE `test`.`test` (
    ->   `int_id` INT NOT NULL AUTO_INCREMENT,
    ->   `int_nullable` INT NULL DEFAULT NULL,
    ->   `float` FLOAT NOT NULL,
    ->   `float_nullable` FLOAT NULL DEFAULT NULL,
    ->   PRIMARY KEY (`int_id`));
Query OK, 0 rows affected (0,09 sec)

mysql> insert into test.test (`int_id`, `float`) VALUES (1,2);
Query OK, 1 row affected (0,00 sec)

mysql> select * from test.test;
+------+----------+-----+----------+
| int_id | int_nullable | float | float_nullable |
+------+----------+-----+----------+
|      1 |         NULL |     2 |           NULL |
+------+----------+-----+----------+
1 row in set (0,00 sec)
```

ClickHouse 中从 MySQL 表检索数据的表：

```sql theme={null}
CREATE TABLE odbc_t
(
    `int_id` Int32,
    `float_nullable` Nullable(Float32)
)
ENGINE = ODBC('DSN=mysqlconn', 'test', 'test')
```

```sql theme={null}
SELECT * FROM odbc_t
```

```text theme={null}
┌─int_id─┬─float_nullable─┐
│      1 │           ᴺᵁᴸᴸ │
└────────┴────────────────┘
```

<div id="see-also">
  ## 另请参见
</div>

* [ODBC 字典](/zh/reference/statements/create/dictionary/sources/odbc)
* [ODBC 表函数](/zh/reference/functions/table-functions/odbc)
