الانتقال إلى المحتوى الرئيسي
سلسلة نصية ذات طول ثابت يبلغ N بايت (وليست محارف ولا نقاط ترميز). للتصريح عن عمود من النوع FixedString، استخدم الصيغة التالية:
<column_name> FixedString(N)
حيث إن N عدد طبيعي. يكون النوع FixedString فعّالًا عندما يكون طول البيانات N بايتًا بالضبط. وفي جميع الحالات الأخرى، يُرجَّح أن يؤدي إلى انخفاض الكفاءة. أمثلة على القيم التي يمكن تخزينها بكفاءة في الأعمدة من النوع FixedString:
  • التمثيل الثنائي لعناوين IP (FixedString(16) لعناوين IPv6).
  • رموز اللغات (ru_RU, en_US … ).
  • رموز العملات (USD, RUB … ).
  • التمثيل الثنائي لقيم hash (FixedString(16) لـ MD5، وFixedString(32) لـ SHA256).
لتخزين قيم UUID، استخدم نوع البيانات UUID. عند إدراج البيانات، فإن ClickHouse:
  • يُكمل السلسلة النصية ببايتات null إذا كانت السلسلة تحتوي على أقل من N بايت.
  • يُصدر الاستثناء Too large value for FixedString(N) إذا كانت السلسلة تحتوي على أكثر من N بايت.
لننظر في الجدول التالي الذي يحتوي على عمود واحد من النوع FixedString(2):

INSERT INTO FixedStringTable VALUES ('a'), ('ab'), ('');
SELECT
    name,
    toTypeName(name),
    length(name),
    empty(name)
FROM FixedStringTable;
┌─name─┬─toTypeName(name)─┬─length(name)─┬─empty(name)─┐
│ a    │ FixedString(2)   │            2 │           0 │
│ ab   │ FixedString(2)   │            2 │           0 │
│      │ FixedString(2)   │            2 │           1 │
└──────┴──────────────────┴──────────────┴─────────────┘
لاحظ أن طول القيمة FixedString(N) ثابت. تُرجع الدالة length القيمة N حتى إذا كانت قيمة FixedString(N) مملوءة فقط ببايتات فارغة، لكن الدالة empty تُرجع 1 في هذه الحالة. يؤدي تحديد البيانات باستخدام بند WHERE إلى نتائج مختلفة بحسب كيفية تحديد الشرط:
  • إذا استُخدم عامل المساواة = أو == أو الدالة equals، فإن ClickHouse لا يأخذ المحرف \0 في الاعتبار، أي إن الاستعلامين SELECT * FROM FixedStringTable WHERE name = 'a'; و SELECT * FROM FixedStringTable WHERE name = 'a\0'; يُرجعان النتيجة نفسها.
  • إذا استُخدم بند LIKE، فإن ClickHouse يأخذ المحرف \0 في الاعتبار، لذا قد يلزم تحديد المحرف \0 صراحةً في شرط التصفية.
SELECT name
FROM FixedStringTable
WHERE name = 'a'
FORMAT JSONStringsEachRow

{"name":"a\u0000"}

SELECT name
FROM FixedStringTable
WHERE name = 'a\0'
FORMAT JSONStringsEachRow

{"name":"a\u0000"}

SELECT name
FROM FixedStringTable
WHERE name = 'a'
FORMAT JSONStringsEachRow

Query id: c32cec28-bb9e-4650-86ce-d74a1694d79e

{"name":"a\u0000"}

SELECT name
FROM FixedStringTable
WHERE name LIKE 'a'
FORMAT JSONStringsEachRow

0 rows in set.

SELECT name
FROM FixedStringTable
WHERE name LIKE 'a\0'
FORMAT JSONStringsEachRow

{"name":"a\u0000"}
آخر تعديل في ٢٥ يونيو ٢٠٢٦