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

# MySQL 的 vsql_complex 扩展

> vsql_complex 扩展为 MySQL 添加 COMPLEX 列类型，带有算术、模和共轭函数，并作为 VEF 自定义类型的完整示例随服务器提供。

`vsql_complex` 添加了一个 `COMPLEX` 列类型，它把复数存储为两个双精度数，
并附带相应的算术运算。它作为自定义类型的完整示例随服务器一起提供，
展示了一个 VEF 类型从头到尾需要什么：二进制布局、文本形式、比较规则
和聚合函数。

| | |
| - | - |
| **维护者** | VillageSQL |
| **源代码** | [villagesql-server/villagesql/examples/vsql-complex](https://github.com/villagesql/villagesql-server/tree/main/villagesql/examples/vsql-complex) |
| **许可证** | GPL-2.0 |

## 安装

`vsql_complex` 位于服务器源代码树中，因此无论用哪种方式安装（包括从
源代码构建），它的包都已存在。用一条语句将它安装到服务器中：

```sql theme={null}
INSTALL EXTENSION vsql_complex;
```

确认它已存在：

```sql theme={null}
SELECT EXTENSION_NAME
FROM INFORMATION_SCHEMA.EXTENSIONS
WHERE EXTENSION_NAME = 'vsql_complex';
```

```
+----------------+
| EXTENSION_NAME |
+----------------+
| vsql_complex   |
+----------------+
```

## 新增内容

### COMPLEX 类型

值写作 `'(real,imaginary)'`，占用 16 字节。该包还注册了一个 `COMPLEX2`
变体，本页不作介绍。

```sql theme={null}
CREATE TABLE signals (
    id        INT PRIMARY KEY,
    impedance COMPLEX
);
```

### 函数

| 函数 | 返回 | 作用 |
| - | - | - |
| `complex_add(a, b)` | `COMPLEX` | 加法 |
| `complex_subtract(a, b)` | `COMPLEX` | 减法 |
| `complex_multiply(a, b)` | `COMPLEX` | 乘法 |
| `complex_divide(a, b)` | `COMPLEX` | 除法 |
| `complex_real(a)` | 实数 | 实部 |
| `complex_imag(a)` | 实数 | 虚部 |
| `complex_abs(a)` | 实数 | 模 |
| `complex_conjugate(a)` | `COMPLEX` | 共轭 |
| `complex_sum(a)` | `COMPLEX` | 聚合：组内各值之和 |

## 示例

```sql theme={null}
INSERT INTO signals VALUES
    (1, '(50.0,0.0)'),
    (2, '(3.0,4.0)'),
    (3, '(0.0,-2.5)');

SELECT id, impedance,
       complex_real(impedance) AS re,
       complex_imag(impedance) AS im,
       complex_abs(impedance) AS magnitude
FROM signals;
```

```
+----+-----------+------+------+-----------+
| id | impedance | re   | im   | magnitude |
+----+-----------+------+------+-----------+
|  1 | (50,0)    |   50 |    0 |        50 |
|  2 | (3,4)     |    3 |    4 |         5 |
|  3 | (0,-2.5)  |    0 | -2.5 |       2.5 |
+----+-----------+------+------+-----------+
```

乘以 `(0,1)` 会把一个值旋转四分之一圈，而聚合函数会把整列相加：

```sql theme={null}
SELECT complex_multiply(impedance, '(0,1)') AS rotated FROM signals WHERE id = 2;
SELECT complex_sum(impedance) AS total FROM signals;
```

```
+---------+
| rotated |
+---------+
| (-4,3)  |
+---------+
+----------+
| total    |
+----------+
| (53,1.5) |
+----------+
```

## 另请参阅

* [自定义类型](https://villagesql.com/docs/zh/sdk/cpp/custom-types.md) — VEF 类型如何声明，以及服务器对它的要求
* [创建扩展](https://villagesql.com/docs/zh/extensions/build/create.md) — 构建您自己的扩展
* [可用扩展](https://villagesql.com/docs/zh/extensions/catalog) — 完整目录


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.