قواعد نوع بيانات SQL
ينطبق على: التحقق من Databricks SQL Databricks Runtime
يستخدم Azure Databricks العديد من القواعد لحل التعارضات بين أنواع البيانات:
- الترقية توسع نوعا بأمان إلى نوع أوسع.
- يؤدي النشر الضمني لأسفل إلى تضييق نوع. عكس الترقية.
- يؤدي الإرسال المتقاطع الضمني إلى تحويل نوع إلى نوع آخر من العائلة.
يمكنك أيضا الصب بشكل صريح بين العديد من الأنواع:
- يتم تحويل الدالة المصبوبة بين معظم الأنواع، وترجع الأخطاء إذا لم تتمكن من ذلك.
- تعمل الدالة 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) |
الثنائيه | الثنائيه |
منطقيه | منطقيه |
الفاصل الزمني | الفاصل الزمني |
خريطه | MAP (2) |
سلسله | سلسله |
البنيه | بنية (2) |
(1) بالنسبة للنوع الأقل شيوعا ، يتم تخطي FLOAT لتجنب فقدان الدقة.
(2) بالنسبة لنوع معقد، تنطبق قاعدة الأسبقية بشكل متكرر على عناصر المكون الخاصة بها.
سلاسل وخالية
تنطبق القواعد الخاصة على STRING
و غير مطبوعة NULL
:
NULL
يمكن ترقيته إلى أي نوع آخر.STRING
يمكن ترقيته إلىBIGINT
وBINARY
BOOLEAN
وDATE
وDOUBLE
INTERVAL
.TIMESTAMP
إذا تعذر تحويل قيمة السلسلة الفعلية إلى النوع الأقل شيوعا فإن Azure Databricks يثير خطأ في وقت التشغيل. عند الترقية إلىINTERVAL
قيمة السلسلة يجب أن تتطابق مع وحدات الفواصل الزمنية.
الرسم البياني لأولوية النوع
هذا تصوير رسومي للتسلسل الهرمي للأسبقية، يجمع بين قائمة أسبقية النوعوالسلاسل وقواعد NULLs .
دقة النوع الأقل شيوعا
النوع الأقل شيوعا من مجموعة من الأنواع هو أضيق نوع يمكن الوصول إليه من الرسم البياني لأسبقية النوع بواسطة جميع عناصر مجموعة الأنواع.
يتم استخدام دقة النوع الأقل شيوعا من أجل:
- حدد ما إذا كان يمكن استدعاء دالة تتوقع معلمة من نوع معين باستخدام وسيطة من نوع أضيق.
- اشتق نوع الوسيطة لدالة تتوقع نوع وسيطة مشتركة لمعلمات متعددة، مثل الاندماج أو فيأو على الأقل أو الأكبر.
- اشتقاق الأنواع المعاملات لعوامل التشغيل مثل العمليات الحسابية أو المقارنات.
- اشتق نوع النتيجة لتعبيرات مثل تعبير الحالة.
- اشتق أنواع العناصر أو المفاتيح أو القيم لمنشئات الصفيفوالخريطة .
- اشتق نوع نتيجة عوامل التشغيل UNION أو INTERSECT أو EXCEPT .
يتم تطبيق قواعد خاصة إذا تم حل النوع الأقل شيوعا إلى FLOAT
. إذا كان أي من الأنواع المساهمة هو نوع رقمي دقيق (TINYINT
أو BIGINT
DECIMAL
SMALLINT
INTEGER
) يتم DOUBLE
دفع النوع الأقل شيوعا لتجنب الخسارة المحتملة للأرقام.
النشر الضمني والبث المتقاطع
يستخدم Azure Databricks هذه الأشكال من الصب الضمني فقط على استدعاء الدالة والمشغل، وفقط حيث يمكنه تحديد الهدف بشكل لا لبس فيه.
النشر الضمني لأسفل
يؤدي النشر الضمني إلى تحويل نوع أوسع تلقائيا إلى نوع أضيق دون مطالبتك بتحديد الإرسال بشكل صريح. يعد النشر لأسفل مناسبا، ولكنه ينطوي على خطر حدوث أخطاء غير متوقعة في وقت التشغيل إذا فشلت القيمة الفعلية في أن تكون قابلة للتمثيل في النوع الضيق.
يطبق البث لأسفل قائمة أسبقية النوع بترتيب عكسي.
البث الضمني
يؤدي الإرسال المتقاطع الضمني إلى تحويل قيمة من عائلة من نوع إلى آخر دون مطالبتك بتحديد الإرسال بشكل صريح.
يدعم Azure Databricks البث المتقاطع الضمني من:
- أي نوع بسيط، باستثناء
BINARY
، إلىSTRING
. - إلى
STRING
أي نوع بسيط.
- أي نوع بسيط، باستثناء
الصب على استدعاء الدالة
نظرا لوظيفة أو عامل تشغيل تم حله، تنطبق القواعد التالية، بالترتيب الذي يتم سردها به، لكل معلمة وزوج وسيطة:
إذا كان نوع المعلمة المدعوم جزءا من الرسم البياني لأسبقية نوعالوسيطة، فإن Azure Databricks يعزز الوسيطة إلى نوع المعلمة هذا.
في معظم الحالات، ينص وصف الدالة صراحة على الأنواع أو السلسلة المدعومة، مثل "أي نوع رقمي".
على سبيل المثال، تعمل sin(expr) على
DOUBLE
ولكنها ستقبل أي رقم.إذا كان نوع المعلمة المتوقع هو
STRING
و الوسيطة هي نوع بسيط يقوم Azure Databricks ببث الوسيطة إلى نوع معلمة السلسلة.على سبيل المثال، تتوقع
str
السلسلة الفرعية (str، البدء، len) أن تكونSTRING
. بدلا من ذلك، يمكنك تمرير نوع رقمي أو نوع التاريخ والوقت.إذا كان نوع الوسيطة هو
STRING
ونوع المعلمة المتوقع هو نوع بسيط، فإن Azure Databricks يبث وسيطة السلسلة إلى أوسع نوع معلمة مدعوم.على سبيل المثال، يتوقع
DATE
date_add (التاريخ، الأيام) و.INTEGER
إذا قمت باستدعاء
date_add()
ب s،STRING
فإن Azure Databricks يقوم بالبث المتقاطع الأولSTRING
DATE
إلى والثانيSTRING
إلىINTEGER
.إذا كانت الدالة تتوقع نوعا رقميا، مثل
INTEGER
، أوDATE
نوع، ولكن الوسيطة هي نوع أكثر عمومية، مثلDOUBLE
أوTIMESTAMP
، يقوم Azure Databricks ضمنيا بتنظيف الوسيطة إلى نوع المعلمة هذا.على سبيل المثال، يتوقع
DATE
date_add (التاريخ والأيام) وINTEGER
.إذا قمت باستدعاء
date_add()
معTIMESTAMP
وBIGINT
، يقوم Azure Databricks بإيقاف التشغيلTIMESTAMP
إلىDATE
عن طريق إزالة مكون الوقت وBIGINT
إلىINTEGER
.وإلا، فإن 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