قواعد نوع بيانات SQL
ينطبق على: Databricks SQL Databricks Runtime
يستخدم Azure Databricks العديد من القواعد لحل التعارضات بين أنواع البيانات:
- الترقية توسع نوعا بأمان إلى نوع أوسع.
- يؤدي النشر الضمني لأسفل إلى تضييق نوع. عكس الترقية.
- يؤدي الإرسال المتقاطع الضمني إلى تحويل نوع إلى نوع عائلة من نوع آخر.
يمكنك أيضا التحويل بشكل صريح بين العديد من الأنواع:
- يتم تحويل الدالة cast بين معظم الأنواع، وترجع أخطاء إذا لم تتمكن من ذلك.
- تعمل الدالة try_cast مثل الدالة cast ولكنها ترجع NULL عند تمرير قيم غير صالحة.
- يتم تحويل الدوال المضمنة الأخرى بين الأنواع باستخدام توجيهات التنسيق المتوفرة.
ترقية النوع
ترقية النوع هي عملية تحويل نوع إلى نوع آخر من نفس نوع العائلة الذي يحتوي على جميع القيم المحتملة من النوع الأصلي.
لذلك ترقية النوع هي عملية آمنة. على سبيل المثال TINYINT
لديه نطاق من -128
إلى 127
. يمكن ترقية جميع قيمها الممكنة بأمان إلى INTEGER
.
قائمة أسبقية النوع
تحدد قائمة أسبقية النوع ما إذا كان يمكن ترقية قيم نوع بيانات معين ضمنيا إلى نوع بيانات آخر.
نوع البيانات | قائمة الأسبقية (من الأضيق إلى الأعرض) |
---|---|
TINYINT | TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
SMALLINT | SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
الباحث | INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
BIGINT | BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
عشري | DECIMAL -> FLOAT (1) -> DOUBLE |
طفا | FLOAT (1) -> مزدوج |
مزدوج | مزدوج |
تاريخ | التاريخ -> الطابع الزمني |
الطابع الزمني | الطابع الزمني |
صفيف | صفيف (2) |
ثنائي | ثنائي |
منطقيه | BOOLEAN |
فترة | الفاصل |
خريطة | MAP (2) |
خيط | سلسلة |
البنيه | بنية (2) |
متغير | متغير |
كائن | OBJECT (3) |
(1) يتم تخطي دقة FLOAT
النوع الأقل شيوعا لتجنب فقدان الدقة.
(2) بالنسبة لنوع معقد، تنطبق قاعدة الأسبقية بشكل متكرر على عناصر المكون الخاصة بها.
(3) OBJECT
موجود فقط داخل VARIANT
.
سلاسل وخالية
تنطبق القواعد الخاصة على STRING
و غير المصممة NULL
:
NULL
يمكن ترقيته إلى أي نوع آخر.STRING
يمكن ترقيته إلىBIGINT
وBOOLEAN
BINARY
وINTERVAL
DATE
DOUBLE
.TIMESTAMP
إذا تعذر تحويل قيمة السلسلة الفعلية إلى النوع الأقل شيوعا، فإن Azure Databricks يثير خطأ في وقت التشغيل. عند الترقية إلىINTERVAL
قيمة السلسلة يجب أن تتطابق مع وحدات الفواصل الزمنية.
الرسم البياني لأولوية النوع
هذا تصوير رسومي للتسلسل الهرمي للأسبقية، يجمع بين قائمة أسبقية النوع والسلاسل وقواعد NULLs .
دقة النوع الأقل شيوعا
النوع الأقل شيوعا من مجموعة من الأنواع هو أضيق نوع يمكن الوصول إليه من الرسم البياني لأسبقية النوع بواسطة كافة عناصر مجموعة الأنواع.
يتم استخدام دقة النوع الأقل شيوعا من أجل:
- حدد ما إذا كان يمكن استدعاء دالة تتوقع معلمة من نوع معين باستخدام وسيطة من نوع أضيق.
- اشتق نوع الوسيطة لدالة تتوقع نوع وسيطة مشتركة لمعلمات متعددة، مثل الاندماج أو في أو على الأقل أو الأكبر.
- اشتقاق أنواع المعاملات لعوامل التشغيل مثل العمليات الحسابية أو المقارنات.
- اشتقاق نوع النتيجة لتعبيرات مثل تعبير الحالة.
- اشتقاق نوع العنصر أو المفتاح أو القيمة لمنشئات الصفيف والخريطة.
- اشتقاق نوع نتيجة عوامل التشغيل UNION أو INTERSECT أو EXCEPT .
يتم تطبيق القواعد الخاصة إذا تم حل النوع الأقل شيوعا إلى FLOAT
. إذا كان أي من الأنواع المساهمة هو نوع رقمي دقيق (TINYINT
أو SMALLINT
BIGINT
INTEGER
DECIMAL
) يتم دفع DOUBLE
النوع الأقل شيوعا لتجنب فقدان الأرقام المحتمل.
النشر الضمني والبث المتقاطع
تستخدم Azure Databricks هذه الأشكال من الصب الضمني فقط على استدعاء الوظيفة والمشغل، وفقط حيث يمكن تحديد الهدف بشكل لا لبس فيه.
النشر الضمني
يؤدي النشر الضمني لأسفل تلقائيا إلى تحويل نوع أوسع إلى نوع أضيق دون مطالبتك بتحديد الإرسال بشكل صريح. يعد النشر لأسفل مناسبا، ولكنه ينطوي على خطر حدوث أخطاء غير متوقعة في وقت التشغيل إذا فشلت القيمة الفعلية في أن تكون قابلة للتمثيل في النوع الضيق.
يطبق Downcasting قائمة أسبقية النوع بترتيب عكسي.
الإرسال المتقاطع الضمني
يؤدي الإرسال المتقاطع الضمني إلى تحويل قيمة من عائلة من نوع إلى آخر دون مطالبتك بتحديد الإرسال بشكل صريح.
يدعم Azure Databricks الإرسال المتقاطع الضمني من:
- أي نوع بسيط، باستثناء
BINARY
، إلىSTRING
. - إلى
STRING
أي نوع بسيط.
- أي نوع بسيط، باستثناء
التحويل على استدعاء الدالة
بالنظر إلى دالة أو عامل تشغيل تم حله، تنطبق القواعد التالية، بالترتيب الذي يتم سردها به، لكل معلمة وزوج وسيطة:
إذا كان نوع المعلمة المدعوم جزءا من الرسم البياني لأسبقية نوع الوسيطة، فإن Azure Databricks يعزز الوسيطة إلى نوع المعلمة هذا.
في معظم الحالات، يذكر وصف الدالة صراحة الأنواع أو السلسلة المدعومة، مثل "أي نوع رقمي".
على سبيل المثال، تعمل sin(expr) على
DOUBLE
ولكنها ستقبل أي رقم.إذا كان نوع المعلمة المتوقع هو
STRING
و الوسيطة هي نوع بسيط يقوم Azure Databricks ببث الوسيطة إلى نوع معلمة السلسلة.على سبيل المثال، يتوقع
str
substr(str, start, len) أن يكونSTRING
. بدلا من ذلك، يمكنك تمرير نوع رقمي أو نوع التاريخ والوقت.إذا كان نوع الوسيطة
STRING
هو ونوع المعلمة المتوقع هو نوع بسيط، فإن Azure Databricks يبث وسيطة السلسلة إلى أكبر نوع معلمة مدعوم.على سبيل المثال، يتوقع
DATE
date_add (التاريخ، الأيام) و.INTEGER
إذا قمت باستدعاء
date_add()
مع اثنينSTRING
s، فإن Azure Databricks يقوم بالبث المتقاطع الأولSTRING
DATE
إلى والثانيSTRING
إلىINTEGER
.إذا كانت الدالة تتوقع نوعا رقميا، مثل
INTEGER
، أوDATE
نوع، ولكن الوسيطة هي نوع أكثر عمومية، مثلDOUBLE
أوTIMESTAMP
، يقوم Azure Databricks ضمنيا بإيقاف تشغيل الوسيطة لنوع المعلمة هذا.على سبيل المثال، يتوقع
DATE
date_add (التاريخ والأيام) و.INTEGER
إذا قمت باستدعاء مع و، يقوم Azure Databricks بإيقاف الإرسال
TIMESTAMP
إلىDATE
عن طريق إزالة مكون الوقت وBIGINT
إلىINTEGER
.BIGINT
TIMESTAMP
date_add()
وإلا، فإن Azure Databricks يثير خطأ.
الأمثلة
تقبل دالة الاندماج أي مجموعة من أنواع الوسيطات طالما أنها تشترك في نوع أقل شيوعا.
نوع النتيجة هو النوع الأقل شيوعا من الوسيطات.
-- The least common type of TINYINT and BIGINT is BIGINT
> SELECT typeof(coalesce(1Y, 1L, NULL));
BIGINT
-- INTEGER and DATE do not share a precedence chain or support crosscasting in either direction.
> SELECT typeof(coalesce(1, DATE'2020-01-01'));
Error: Incompatible types [INT, DATE]
-- Both are ARRAYs and the elements have a least common type
> SELECT typeof(coalesce(ARRAY(1Y), ARRAY(1L)))
ARRAY<BIGINT>
-- The least common type of INT and FLOAT is DOUBLE
> SELECT typeof(coalesce(1, 1F))
DOUBLE
> SELECT typeof(coalesce(1L, 1F))
DOUBLE
> SELECT typeof(coalesce(1BD, 1F))
DOUBLE
-- The least common type between an INT and STRING is BIGINT
> SELECT typeof(coalesce(5, '6'));
BIGINT
-- The least common type is a BIGINT, but the value is not BIGINT.
> SELECT coalesce('6.1', 5);
Error: 6.1 is not a BIGINT
-- The least common type between a DECIMAL and a STRING is a DOUBLE
> SELECT typeof(coalesce(1BD, '6'));
DOUBLE
تتوقع دالة السلسلة الفرعية وسيطات من نوع STRING
السلسلة ومعلمات INTEGER
البدء والطول.
-- Promotion of TINYINT to INTEGER
> SELECT substring('hello', 1Y, 2);
he
-- No casting
> SELECT substring('hello', 1, 2);
he
-- Casting of a literal string
> SELECT substring('hello', '1', 2);
he
-- Downcasting of a BIGINT to an INT
> SELECT substring('hello', 1L, 2);
he
-- Crosscasting from STRING to INTEGER
> SELECT substring('hello', str, 2)
FROM VALUES(CAST('1' AS STRING)) AS T(str);
he
-- Crosscasting from INTEGER to STRING
> SELECT substring(12345, 2, 2);
23
|| (CONCAT) يسمح بالبث المتقاطع الضمني إلى سلسلة.
-- A numeric is cast to STRING
> SELECT 'This is a numeric: ' || 5.4E10;
This is a numeric: 5.4E10
-- A date is cast to STRING
> SELECT 'This is a date: ' || DATE'2021-11-30';
This is a date: 2021-11-30
يمكن استدعاء date_add ب TIMESTAMP
أو BIGINT
بسبب النشر الضمني.
> SELECT date_add(TIMESTAMP'2011-11-30 08:30:00', 5L);
2011-12-05
يمكن استدعاء date_add مع STRING
s بسبب الإرسال المتقاطع الضمني.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05