سلسلة نصية ذات طول ثابت يبلغ 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"}