<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->

# DBeaver

## 1. Feature Overview

DBeaver is an open-source universal database management tool that supports core functionalities including data query and visualization, metadata management, data import/export, and driver extensions. It provides a cross-platform graphical interface for various databases (e.g., MySQL, PostgreSQL, Oracle).

![](/img/dbeaver-2520-1-en.png)

## 2. Prerequisites

Ensure DBeaver and IoTDB are installed:

- DBeaver(>= V25.2.0), download: https://dbeaver.io/download/

- IoTDB is running, download: https://iotdb.apache.org/Download/

## 3. Create Connection

1. Click ​​DBeaver > Database > New Database Connection​​, or directly click the icon in the upper-left corner.

![](/img/dbeaver-2520-2-en.png)

2. Select the ​​IoTDB driver​​ (you can find it under the ​​All​​ or ​​Timeseries​​ category).

![](/img/dbeaver-2520-3-en.png)

3. Complete the connection settings, and choose the appropriate sql dialect based on whether the target IoTDB uses a ​​Tree Model​​ or ​​Table Model​​.

![](/img/dbeaver-2520-4-en.png)

4. Test the connection (make sure to select the driver file compatible with your version). If the connection is successful, a prompt will appear showing "Connected," along with the server version and driver version.

![](/img/dbeaver-2520-5-en.png)


## 4. Usage Guide

1. ​​Database Overview​​

In the left-side `​​Database Navigator​`​, you can view database-related information, including: database name, table names, column names, column data types, column comments.

 ![](/img/dbeaver-new-table-1-en.png)

 2. Table Structure

Double-click a table in the database list to display its structure in the ​​`Properties​`​ tab on the right panel, including: basic table attributes and detailed column information.

 ![](/img/dbeaver-new-table-2-en.png)

 The `​​Primary Keys`​​ section shows the table's composite primary keys (time + tag columns).

 ![](/img/dbeaver-new-table-3-en.png)

 3. ​Data View​​

Switch to the `Data` tab to explore all stored data for the selected table.

 ![](/img/dbeaver-new-table-4-en.png)

 4. ​Functions and Data Types​​

Under `Database Navigator` → `Procedures`, view all supported functions.

 ![](/img/dbeaver-new-table-5-en.png)

The `Data Types` tab lists all currently supported data types.

 ![](/img/dbeaver-new-table-6-en.png) 