> ## 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.

> يتيح تنفيذ استعلامات `SELECT` و`INSERT` على البيانات المخزّنة على خادم MySQL بعيد.

# mysql

يتيح تنفيذ استعلامات `SELECT` و`INSERT` على البيانات المخزّنة على خادم MySQL بعيد.

<div id="syntax">
  ## البنية
</div>

```sql theme={null}
mysql({host:port, database, table, user, password[, replace_query, on_duplicate_clause] | named_collection[, option=value [,..]]})
```

<div id="arguments">
  ## الوسيطات
</div>

| Argument              | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `host:port`           | عنوان خادم MySQL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `database`            | اسم قاعدة البيانات البعيدة.                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `table`               | اسم الجدول البعيد، أو استعلام يُمرَّر إلى MySQL كما هو (راجع [تمرير استعلام بدلًا من اسم جدول](#passing-a-query)).                                                                                                                                                                                                                                                                                                                                                                            |
| `user`                | مستخدم MySQL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `password`            | كلمة مرور المستخدم.                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `replace_query`       | علامة تُحوِّل استعلامات `INSERT INTO` إلى `REPLACE INTO`. القيم الممكنة:<br />    - `0` - يُنفَّذ الاستعلام على هيئة `INSERT INTO`.<br />    - `1` - يُنفَّذ الاستعلام على هيئة `REPLACE INTO`.                                                                                                                                                                                                                                                                                               |
| `on_duplicate_clause` | التعبير `ON DUPLICATE KEY on_duplicate_clause` الذي يُضاف إلى استعلام `INSERT`. لا يمكن تحديده إلا مع `replace_query = 0` (إذا مرّرت `replace_query = 1` و`on_duplicate_clause` في الوقت نفسه، فسينتج ClickHouse استثناءً).<br />    مثال: `INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1;`<br />    تكون `on_duplicate_clause` هنا هي `UPDATE c2 = c2 + 1`. راجع وثائق MySQL لمعرفة قيمة `on_duplicate_clause` التي يمكنك استخدامها مع عبارة `ON DUPLICATE KEY`. |

يمكن أيضًا تمرير الوسيطات باستخدام [المجموعات المسماة](/docs/ar/concepts/features/configuration/server-config/named-collections). في هذه الحالة، يجب تحديد `host` و`port` كلٌّ على حدة. يُوصى بهذا الأسلوب في بيئة الإنتاج.

تُنفَّذ عبارات `WHERE` البسيطة مثل `=, !=, >, >=, <, <=` حاليًا على خادم MySQL.

أما بقية الشروط وقيد `LIMIT` لأخذ العينات، فتُنفَّذ في ClickHouse فقط بعد انتهاء الاستعلام إلى MySQL.

<div id="passing-a-query">
  ## تمرير استعلام بدلًا من اسم جدول
</div>

بدلًا من اسم جدول، يمكن أن تكون الوسيطة الثالثة استعلام `SELECT` يُمرَّر إلى MySQL كما هو. ويُستدل على بنية الجدول الناتج من نتيجة الاستعلام. ويمكن كتابة الاستعلام إما على شكل استعلام فرعي، أو تغليفه داخل الدالة `query`:

```sql theme={null}
SELECT * FROM mysql('localhost:3306', 'test', (SELECT a, b FROM t1 JOIN t2 USING (id) WHERE a > 0), 'user', 'password');
SELECT * FROM mysql('localhost:3306', 'test', query('SELECT a, b FROM t1 JOIN t2 USING (id) WHERE a > 0'), 'user', 'password');
```

يفيد هذا في دفع عمليات الربط والتجميع أو أي معالجة أخرى إلى MySQL. ويكون هذا الجدول للقراءة فقط: لا يُسمح بإجراء `INSERT` فيه. كما يدعم محرّك الجدول [`MySQL`](/docs/ar/reference/engines/table-engines/integrations/mysql) البنية نفسها.

<Note>
  يحلّل ClickHouse صيغة الاستعلام الفرعي `(SELECT ...)` ثم يعيد تسلسلها وفق لهجة MySQL (باستخدام علامات الاقتباس الخلفية للمعرّفات) قبل إرسالها إلى الخادم. لذلك يجب أن تكون صالحة في ClickHouse SQL. ولتمرير بنية خاصة بـ MySQL لا يستطيع ClickHouse تحليلها، استخدم صيغة `query('...')`، إذ يُرسَل نصها إلى MySQL كما هو.

  أي `WHERE` أو `LIMIT` أو تجميع أو غير ذلك في استعلام ClickHouse المحيط لا يُدفَع **مطلقًا** إلى داخل الاستعلام المُمرَّر، بل يُطبَّق في ClickHouse بعد جلب نتيجة الاستعلام كاملة. ولتقييد البيانات المقروءة من MySQL، ضع عامل التصفية داخل الاستعلام المُمرَّر. عند استخدام [`external_table_strict_query = 1`](/docs/ar/reference/settings/session-settings#external_table_strict_query)، يُرفَض أي عامل تصفية خارجي لا يمكن دفعه مع استثناء بدلًا من تطبيقه محليًا.
</Note>

يدعم عدة نُسخ متماثلة يجب إدراجها باستخدام `|`. على سبيل المثال:

```sql theme={null}
SELECT name FROM mysql(`mysql{1|2|3}:3306`, 'mysql_database', 'mysql_table', 'user', 'password');
```

OR

```sql theme={null}
SELECT name FROM mysql(`mysql1:3306|mysql2:3306|mysql3:3306`, 'mysql_database', 'mysql_table', 'user', 'password');
```

<div id="returned_value">
  ## القيمة المُعادة
</div>

كائن جدول له الأعمدة نفسها الموجودة في جدول MySQL الأصلي.

<Note>
  يمكن ربط بعض أنواع بيانات MySQL بأنواع مختلفة في ClickHouse، ويُتحكَّم في ذلك عبر الإعداد على مستوى الاستعلام [mysql\_datatypes\_support\_level](/docs/ar/reference/settings/session-settings#mysql_datatypes_support_level)
</Note>

<Note>
  في استعلام `INSERT`، وللتمييز بين دالة الجدول `mysql(...)` واسم جدول يتبعه قائمة بأسماء الأعمدة، يجب استخدام الكلمتين المفتاحيتين `FUNCTION` أو `TABLE FUNCTION`. راجع الأمثلة أدناه.
</Note>

<div id="examples">
  ## أمثلة
</div>

جدول في MySQL:

```text theme={null}
mysql> CREATE TABLE `test`.`test` (
    ->   `int_id` INT NOT NULL AUTO_INCREMENT,
    ->   `float` FLOAT NOT NULL,
    ->   PRIMARY KEY (`int_id`));

mysql> INSERT INTO test (`int_id`, `float`) VALUES (1,2);

mysql> SELECT * FROM test;
+--------+-------+
| int_id | float |
+--------+-------+
|      1 |     2 |
+--------+-------+
```

استخراج البيانات من ClickHouse:

```sql theme={null}
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');
```

أو باستخدام [المجموعات المُسمّاة](/docs/ar/concepts/features/configuration/server-config/named-collections):

```sql theme={null}
CREATE NAMED COLLECTION creds AS
        host = 'localhost',
        port = 3306,
        database = 'test',
        user = 'bayonet',
        password = '123';
SELECT * FROM mysql(creds, table='test');
```

```text theme={null}
┌─int_id─┬─float─┐
│      1 │     2 │
└────────┴───────┘
```

<div id="enable-compression">
  ### `enable_compression`
</div>

يُفعّل الضغط لاتصال بروتوكول MySQL.

القيمة الافتراضية: `false`.

ينطبق هذا الإعداد على:

* دالة الجدول `mysql`;
* محرك الجدول `MySQL`;
* محرك قاعدة البيانات `MySQL`;
* المجموعات المسماة المستخدمة في تكاملات MySQL.

عند تفعيل هذا الإعداد، يطلب ClickHouse ضغط الاتصال.

مثال:

```sql theme={null}
SELECT *
FROM mysql(
    'mysql80:3306',
    'clickhouse',
    'test_table',
    'root',
    'password',
    SETTINGS enable_compression = 1
);
```

الاستبدال والإدراج:

```sql theme={null}
INSERT INTO FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 1) (int_id, float) VALUES (1, 3);
INSERT INTO TABLE FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 0, 'UPDATE int_id = int_id + 1') (int_id, float) VALUES (1, 4);
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');
```

```text theme={null}
┌─int_id─┬─float─┐
│      1 │     3 │
│      2 │     4 │
└────────┴───────┘
```

نسخ البيانات من جدول في MySQL إلى جدول في ClickHouse:

```sql theme={null}
CREATE TABLE mysql_copy
(
   `id` UInt64,
   `datetime` DateTime('UTC'),
   `description` String,
)
ENGINE = MergeTree
ORDER BY (id,datetime);

INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password');
```

أو عند نسخ دفعة تدريجية فقط من MySQL استنادًا إلى أكبر قيمة `id` حالية:

```sql theme={null}
INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password')
WHERE id > (SELECT max(id) FROM mysql_copy);
```

<div id="related">
  ## مواضيع ذات صلة
</div>

* [محرك الجدول 'MySQL'](/docs/ar/reference/engines/table-engines/integrations/mysql)
* [استخدام MySQL كمصدر للقاموس](/docs/ar/reference/statements/create/dictionary/sources/mysql)
* [mysql\_datatypes\_support\_level](/docs/ar/reference/settings/session-settings#mysql_datatypes_support_level)
* [mysql\_map\_fixed\_string\_to\_text\_in\_show\_columns](/docs/ar/reference/settings/session-settings#mysql_map_fixed_string_to_text_in_show_columns)
* [mysql\_map\_string\_to\_text\_in\_show\_columns](/docs/ar/reference/settings/session-settings#mysql_map_string_to_text_in_show_columns)
* [mysql\_max\_rows\_to\_insert](/docs/ar/reference/settings/session-settings#mysql_max_rows_to_insert)
