تحويلات الأنواع
uint32 لتلقّي البيانات من عمود UInt64. وعلى العكس، يمكن إدراج سلسلة نصية في حقل DateTime64 بشرط أن تستوفي متطلبات التنسيق.
التحويلات المدعومة حاليًا للأنواع البدائية موضحة هنا.
ولا يزال هذا العمل مستمرًا، ويمكن تقسيمه إلى وقت الإدراج (Append/AppendRow) ووقت القراءة (عبر Scan). إذا كنت بحاجة إلى دعم لتحويل محدد، فالرجاء فتح issue.
ينبغي أن تدعم واجهة database/sql القياسية الأنواع نفسها التي تدعمها واجهة برمجة تطبيقات ClickHouse. توجد بعض الاستثناءات، خاصةً للأنواع المعقدة، وهي موثقة في الأقسام أدناه. وعلى غرار واجهة برمجة تطبيقات ClickHouse، يهدف العميل إلى أن يكون مرنًا قدر الإمكان في قبول أنواع متغيرات مختلفة، سواء عند الإدراج أو عند تحويل الاستجابات.
الأنواع المركّبة
Date/DateTime
Date وDate32 وDateTime وDateTime64. يمكن إدراج قيم Date كسلسلة نصية بالتنسيق 2006-01-02 أو باستخدام نوع Go الأصلي time.Time{} أو sql.NullTime. كما تدعم DateTime أيضًا النوعين الأخيرين، لكنها تتطلب تمرير السلاسل النصية بالتنسيق 2006-01-02 15:04:05 مع إزاحة منطقة زمنية اختيارية، مثل 2006-01-02 15:04:05 +08:00. كما أن time.Time{} وsql.NullTime مدعومان أيضًا عند القراءة، بالإضافة إلى أي تنفيذ للواجهة sql.Scanner.
تعتمد معالجة معلومات المنطقة الزمنية على نوع ClickHouse وما إذا كانت القيمة تُدرَج أو تُقرَأ:
- DateTime/DateTime64
- عند الإدراج، تُرسل القيمة إلى ClickHouse بتنسيق
Unix timestamp. وإذا لم تُحدَّد منطقة زمنية، فسيفترض العميل المنطقة الزمنية المحلية الخاصة به. كما سيُحوَّلtime.Time{}أوsql.NullTimeإلىepochوفقًا لذلك. - عند الاستعلام، ستُستخدم المنطقة الزمنية الخاصة بالعمود إذا كانت مضبوطة عند إرجاع قيمة
time.Time. وإذا لم تكن كذلك، فستُستخدم المنطقة الزمنية الخاصة بـserver.
- عند الإدراج، تُرسل القيمة إلى ClickHouse بتنسيق
- Date/Date32
- عند الإدراج، تُؤخذ المنطقة الزمنية لأي تاريخ في الحسبان عند تحويله إلى
Unix timestamp، أي ستُطبَّق عليه إزاحة المنطقة الزمنية قبل تخزينه كتاريخ، لأن أنواعDateلا تحتوي على إعداد محلي في ClickHouse. وإذا لم يكن ذلك محددًا في قيمة نصية، فستُستخدم المنطقة الزمنية المحلية. - عند الاستعلام، تُفحَص التواريخ في مثيلات
time.Time{}أوsql.NullTime{}، وتُعاد بدون معلومات عن المنطقة الزمنية.
- عند الإدراج، تُؤخذ المنطقة الزمنية لأي تاريخ في الحسبان عند تحويله إلى
أنواع Time/Time64
Time وTime64 قيم الوقت ضمن اليوم من دون مكوّن تاريخ. ويُقابلهما في Go النوع time.Duration.
- يخزّن
Timeالوقت بدقة الثواني. - يدعم
Time64(precision)دقةً أقل من الثانية (مثلDateTime64)، حيث تتراوح قيمة precision من 0 إلى 9.
Array
Map
عند استخدام واجهة برمجة تطبيقات database/sql، تتطلب قيم Map التقيّد الصارم بالأنواع، لذا لا يمكنك استخدام
interface{} كنوع للقيمة. على سبيل المثال، لا يمكنك تمرير map[string]interface{} إلى حقل Map(String,String)، ويجب استخدام map[string]string بدلًا منه. أمّا متغيّر interface{} فيبقى متوافقًا دائمًا، ويمكن استخدامه مع البُنى الأكثر تعقيدًا.مثال كاملTuples
Nested
map[string]interface{}. والقيم حاليًا ليست محددة الأنواع بشكل صارم.
flatten_tested=0
إذا استُخدمت القيمة الافتراضية 1 لـ flatten_nested، فستُسطَّح الأعمدة من النوع Nested إلى مصفوفات منفصلة. ويتطلب ذلك استخدام شرائح متداخلة عند الإدراج والاسترجاع. ورغم أن مستويات تداخل عشوائية قد تنجح، فإن ذلك غير مدعوم رسميًا.
flatten_nested=1
ملاحظة: يجب أن تكون لأعمدة Nested الأبعاد نفسها. على سبيل المثال، في المثال أعلاه، يجب أن يحتوي Col_2_2 وCol_2_1 على العدد نفسه من العناصر.
نظرًا إلى بساطة الواجهة ودعم التعشيش رسميًا، نوصي باستخدام flatten_nested=0.
أنواع Geo
UUID
sql.Scanner أو Stringify.
Decimal
قد تميل إلى استخدام Float بدلًا من ذلك لتجنّب التبعيات التابعة لجهات خارجية. ولكن انتبه إلى أن أنواع Float في ClickHouse غير موصى بها عند الحاجة إلى قيم دقيقة.إذا اخترت رغم ذلك استخدام نوع Float المدمج في Go على جانب العميل، فيجب عليك تحويل Decimal إلى Float صراحةً باستخدام الدالة toFloat64() أو أحد متغيراتها في استعلامات ClickHouse. وانتبه إلى أن هذا التحويل قد يؤدي إلى فقدان الدقة.
Nullable
Nil في Go قيمة NULL في ClickHouse. ويمكن استخدام ذلك إذا كان أحد الحقول معرّفًا على أنه Nullable. وعند insert time، يمكن تمرير Nil لكلٍّ من الإصدار العادي والإصدار Nullable من العمود. في الحالة الأولى، ستُحفَظ default value الخاصة بالنوع، مثل سلسلة فارغة لـ string. أما في الإصدار Nullable، فستُخزَّن قيمة NULL في ClickHouse.
وعند scan time، يجب على المستخدم تمرير مؤشر إلى نوع يدعم nil، مثل *string، لتمثيل قيمة nil لحقل Nullable. في المثال أدناه، يتلقّى col1، وهو من النوع Nullable(String)، قيمة من النوع **string. وهذا يتيح تمثيل nil.
sql.Null*، مثل sql.NullInt64. وهذه الأنواع متوافقة مع أنواع ClickHouse المناظرة لها.
الأعداد الصحيحة الكبيرة
BFloat16
BFloat16 هو نوع فاصلة عائمة من فئة brain float بعرض 16 بت يُستخدم في أعباء عمل التعلّم الآلي. في Go، تُدرَج قيم BFloat16 وتُقرأ على أنها float32. أما المتغيرات القابلة لأن تكون NULL فتستخدم sql.NullFloat64.
QBit
QBit هو نوع تجريبي للأعمدة لتخزين التضمينات المتجهية بتنسيق الشرائح البتّية، وهو مُحسَّن لعمليات البحث عن التشابه المتجهي. ويتطلب ذلك تفعيل الإعداد allow_experimental_qbit_type.
في Go، يُدرَج عمود QBit(Float32, N) ويُقرأ على هيئة []float32، حيث تمثل N بُعد المتجه.