سلسلة نصية ذات طول ثابت يبلغ 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"}
آخر تعديل في ٢٥ يونيو ٢٠٢٦