قواعد نوع بيانات SQL

ينطبق على:التحقق الذي تم وضع علامة نعم عليه التحقق من Databricks SQL الذي تم وضع علامة عليه نعم Databricks Runtime

يستخدم Azure Databricks العديد من القواعد لحل التعارضات بين أنواع البيانات:

يمكنك أيضا الصب بشكل صريح بين العديد من الأنواع:

ترقية النوع

ترقية النوع هي عملية تحويل نوع إلى نوع آخر من نفس نوع العائلة الذي يحتوي على جميع القيم المحتملة من النوع الأصلي. لذلك ترقية النوع هي عملية آمنة. على سبيل المثال 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و BINARYBOOLEANو DATEوDOUBLEINTERVAL.TIMESTAMP إذا تعذر تحويل قيمة السلسلة الفعلية إلى النوع الأقل شيوعا فإن Azure Databricks يثير خطأ في وقت التشغيل. عند الترقية إلى INTERVAL قيمة السلسلة يجب أن تتطابق مع وحدات الفواصل الزمنية.

الرسم البياني لأولوية النوع

هذا تصوير رسومي للتسلسل الهرمي للأسبقية، يجمع بين قائمة أسبقية النوعوالسلاسل وقواعد NULLs .

التمثيل الرسومي لقواعد الأسبقية

دقة النوع الأقل شيوعا

النوع الأقل شيوعا من مجموعة من الأنواع هو أضيق نوع يمكن الوصول إليه من الرسم البياني لأسبقية النوع بواسطة جميع عناصر مجموعة الأنواع.

يتم استخدام دقة النوع الأقل شيوعا من أجل:

  • حدد ما إذا كان يمكن استدعاء دالة تتوقع معلمة من نوع معين باستخدام وسيطة من نوع أضيق.
  • اشتق نوع الوسيطة لدالة تتوقع نوع وسيطة مشتركة لمعلمات متعددة، مثل الاندماج أو فيأو على الأقل أو الأكبر.
  • اشتقاق الأنواع المعاملات لعوامل التشغيل مثل العمليات الحسابية أو المقارنات.
  • اشتق نوع النتيجة لتعبيرات مثل تعبير الحالة.
  • اشتق أنواع العناصر أو المفاتيح أو القيم لمنشئات الصفيفوالخريطة .
  • اشتق نوع نتيجة عوامل التشغيل UNION أو INTERSECT أو EXCEPT .

يتم تطبيق قواعد خاصة إذا تم حل النوع الأقل شيوعا إلى FLOAT. إذا كان أي من الأنواع المساهمة هو نوع رقمي دقيق (TINYINTأو BIGINTDECIMALSMALLINTINTEGER) يتم DOUBLE دفع النوع الأقل شيوعا لتجنب الخسارة المحتملة للأرقام.

النشر الضمني والبث المتقاطع

يستخدم Azure Databricks هذه الأشكال من الصب الضمني فقط على استدعاء الدالة والمشغل، وفقط حيث يمكنه تحديد الهدف بشكل لا لبس فيه.

  • النشر الضمني لأسفل

    يؤدي النشر الضمني إلى تحويل نوع أوسع تلقائيا إلى نوع أضيق دون مطالبتك بتحديد الإرسال بشكل صريح. يعد النشر لأسفل مناسبا، ولكنه ينطوي على خطر حدوث أخطاء غير متوقعة في وقت التشغيل إذا فشلت القيمة الفعلية في أن تكون قابلة للتمثيل في النوع الضيق.

    يطبق البث لأسفل قائمة أسبقية النوع بترتيب عكسي.

  • البث الضمني

    يؤدي الإرسال المتقاطع الضمني إلى تحويل قيمة من عائلة من نوع إلى آخر دون مطالبتك بتحديد الإرسال بشكل صريح.

    يدعم Azure Databricks البث المتقاطع الضمني من:

    • أي نوع بسيط، باستثناء BINARY، إلى STRING.
    • إلى STRING أي نوع بسيط.

الصب على استدعاء الدالة

نظرا لوظيفة أو عامل تشغيل تم حله، تنطبق القواعد التالية، بالترتيب الذي يتم سردها به، لكل معلمة وزوج وسيطة:

  • إذا كان نوع المعلمة المدعوم جزءا من الرسم البياني لأسبقية نوعالوسيطة، فإن Azure Databricks يعزز الوسيطة إلى نوع المعلمة هذا.

    في معظم الحالات، ينص وصف الدالة صراحة على الأنواع أو السلسلة المدعومة، مثل "أي نوع رقمي".

    على سبيل المثال، تعمل sin(expr) على DOUBLE ولكنها ستقبل أي رقم.

  • إذا كان نوع المعلمة المتوقع هو STRING و الوسيطة هي نوع بسيط يقوم Azure Databricks ببث الوسيطة إلى نوع معلمة السلسلة.

    على سبيل المثال، تتوقع strالسلسلة الفرعية (str، البدء، len) أن تكون STRING. بدلا من ذلك، يمكنك تمرير نوع رقمي أو نوع التاريخ والوقت.

  • إذا كان نوع الوسيطة هو STRING ونوع المعلمة المتوقع هو نوع بسيط، فإن Azure Databricks يبث وسيطة السلسلة إلى أوسع نوع معلمة مدعوم.

    على سبيل المثال، يتوقع DATEdate_add (التاريخ، الأيام) و.INTEGER

    إذا قمت باستدعاء date_add() ب s، STRINGفإن Azure Databricks يقوم بالبث المتقاطع الأول STRINGDATE إلى والثاني STRING إلى INTEGER.

  • إذا كانت الدالة تتوقع نوعا رقميا، مثل INTEGER، أو DATE نوع، ولكن الوسيطة هي نوع أكثر عمومية، مثل DOUBLE أو TIMESTAMP، يقوم Azure Databricks ضمنيا بتنظيف الوسيطة إلى نوع المعلمة هذا.

    على سبيل المثال، يتوقع DATEdate_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 مع STRINGs بسبب الإرسال المتقاطع الضمني.

> SELECT date_add('2011-11-30 08:30:00', '5');
  2011-12-05