إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
ينطبق على:
Databricks SQL
تتحكم معلمة ANSI_MODE التكوين في السلوكيات الرئيسية للوظائف المضمنة وعمليات التحويل.
توضح هذه المقالة وضع ANSI في Databricks SQL. للحصول على توافق ANSI في Databricks Runtime، راجع توافق ANSI في Databricks Runtime.
إعدادات
صحيح
يتبع معيار SQL في كيفية تعامله مع بعض العمليات الحسابية وتحويلات النوع، على غرار معظم قواعد البيانات ومستودعات البيانات. يؤدي اتباع هذا المعيار إلى تحسين جودة البيانات وتكاملها وقابلية نقلها.
خطأ
يستخدم Databricks SQL السلوك المتوافق مع Hive.
يمكنك تعيين هذه المعلمة على مستوى الجلسة باستخدام عبارة SET وعلى المستوى العمومي باستخدام معلمات تكوين SQL أو SQL Warehouse API.
الإعداد الافتراضي للنظام
القيمة الافتراضية للنظام هي TRUE للحسابات المضافة على Databricks SQL 2022.35 وما فوق.
وصف مفصل
تصف الوثائق المرجعية ل Databricks SQL سلوك SQL القياسي.
تصف الأقسام التالية الاختلافات بين ANSI_MODE TRUE (وضع ANSI) و FALSE (وضع غير ANSI).
العوامل
في الوضع غير ANSI، قد ترجع العمليات الحسابية التي يتم إجراؤها على أنواع رقمية قيما زائدة أو NULL، بينما في وضع ANSI، ترجع هذه العمليات خطأ.
| عامل | الوصف | مثال | ANSI_MODE = صحيح | ANSI_MODE = خطأ |
|---|---|---|---|---|
| توزيع الأرباح / عامل القسمة | إرجاع المقسوم مقسوما على عامل القسمة. | 1/0 |
خطأ | NULL |
| - expr | إرجاع القيمة النفي ل expr. | -(-128y) |
خطأ | -128y (تجاوز السعة) |
| expr1 - expr2 | إرجاع طرح expr2 من expr1. | -128y - 1y |
خطأ | 127y (تجاوز السعة) |
| expr1 + expr2 | إرجاع مجموع expr1 وexpr2. | 127y + 1y |
خطأ | -128y (تجاوز السعة) |
| المقسوم على نسبة الأرباح | إرجاع الباقي بعد توزيع الأرباح / المقسوم عليه. | 1 % 0 |
خطأ | NULL |
| مضاعف * مضروب | إرجاع المضاعف مضروبا في ضرب. | 100y * 100y |
خطأ | 16y (تجاوز السعة) |
| arrayExpr[index] | إرجاع عنصر arrayExpr في الفهرس. | فهرس صفيف غير صحيح | خطأ | NULL |
| mapExpr[key] | إرجاع قيمة mapExpr للمفتاح. | مفتاح خريطة غير صحيح | خطأ | NULL |
| المقسوم على توزيعات الأسهم | إرجاع الجزء المتكامل من تقسيم المقسوم حسب المقسوم. | 1 div 0 |
خطأ | NULL |
الوظائف
يمكن أن يختلف سلوك بعض الدالات المضمنة ضمن وضع ANSI مقابل وضع غير ANSI في ظل الشروط المحددة أدناه.
| عامل | الوصف | الحالة | ANSI_MODE = صحيح | ANSI_MODE = خطأ |
|---|---|---|---|---|
| abs (expr) | إرجاع القيمة المطلقة للقيمة الرقمية في expr. | abs(-128y) |
خطأ | -128y (تجاوز السعة) |
| element_at(mapExpr, key) | إرجاع قيمة mapExpr للمفتاح. | مفتاح خريطة غير صحيح | خطأ | NULL |
| element_at(arrayExpr, index) | إرجاع عنصر arrayExpr في الفهرس. | فهرس صفيف غير صحيح | خطأ | NULL |
| elt(index, expr1 [, ...] ) | إرجاع التعبير nth. | فهرس غير صحيح | خطأ | NULL |
| make_date(y,m,d) | إنشاء تاريخ من حقول السنة والشهر واليوم. | تاريخ نتيجة غير صحيح | خطأ | NULL |
| make_timestamp(y,m,d,h,mi,s[,tz]) | إنشاء طابع زمني من الحقول. | الطابع الزمني للنتيجة غير صحيح | خطأ | NULL |
| make_interval(y,m,w,d,h,mi,s) | إنشاء فاصل زمني من الحقول. | الفاصل الزمني للنتيجة غير صحيح | خطأ | NULL |
| mod(المقسوم، المقسوم) | إرجاع الباقي بعد توزيع الأرباح / المقسوم عليه. | mod(1, 0) |
خطأ | NULL |
| next_day(expr,dayOfWeek) | إرجاع التاريخ الأول الذي يقع بعد expr ويسمى كما في dayOfWeek. | يوم من الأسبوع غير صالح | خطأ | NULL |
| parse_url(url, partToExtract[, key]) | استخراج جزء من عنوان url. | عنوان URL غير صالح | خطأ | NULL |
| pmod(المقسوم، المقسوم) | إرجاع الباقي الموجب بعد المقسوم / المقسوم عليه. | pmod(1, 0) |
خطأ | NULL |
| size(expr) | إرجاع العلاقة الأساسية ل expr. | size(NULL) |
NULL |
-1 |
| to_date(expr[,fmt]) | إرجاع تحويل expr إلى تاريخ باستخدام تنسيق اختياري. | expr أو سلسلة تنسيق غير صحيحة | خطأ | NULL |
| to_timestamp(expr[,fmt]) | إرجاع تحويل expr إلى طابع زمني باستخدام تنسيق اختياري. | expr أو سلسلة تنسيق غير صحيحة | خطأ | NULL |
| to_unix_timestamp(expr[,fmt]) | إرجاع الطابع الزمني في expr كطوابع زمنية UNIX. | expr أو سلسلة تنسيق غير صحيحة | خطأ | NULL |
| unix_timestamp([expr[, fmt]]) | إرجاع الطابع الزمني UNIX للوقت الحالي أو المحدد. | expr أو سلسلة تنسيق غير صحيحة | خطأ | NULL |
قواعد التحويل
القواعد والسلوكيات المتعلقة ب CAST أكثر صرامة في وضع ANSI. يمكن تقسيمها إلى الفئات الثلاث التالية:
قواعد تحويل وقت التحويل البرمجي
| نوع المصدر | نوع الهدف | مثال | ANSI_MODE = صحيح | ANSI_MODE = خطأ |
|---|---|---|---|---|
| Boolean | طابع زمني | cast(TRUE AS TIMESTAMP) |
خطأ | 1970-01-01 00:00:00.000001 UTC |
| التاريخ | Boolean | cast(DATE'2001-08-09' AS BOOLEAN) |
خطأ | NULL |
| طابع زمني | Boolean | cast(TIMESTAMP'1970-01-01 00:00:00Z' AS BOOLEAN) |
خطأ | FALSE |
| رقم لا يتجزأ | ثنائي | cast(15 AS BINARY) |
خطأ | تمثيل ثنائي |
أخطاء وقت التشغيل
| نوع المصدر | نوع الهدف | الشرط | مثال | ANSI_MODE = صحيح | ANSI_MODE = خطأ |
|---|---|---|---|---|---|
| السلسلة | غير سلسلة | إدخال غير صحيح | cast('a' AS INTEGER) |
خطأ | NULL |
| صفيف، بنية، خريطة | صفيف، بنية، خريطة | إدخال غير صحيح | cast(ARRAY('1','2','3') AS ARRAY<DATE>) |
خطأ | NULL |
| رقمي | رقمي | تجاوز | cast(12345 AS BYTE) |
خطأ | NULL |
| رقمي | رقم لا يتجزأ | اقتطاع | cast(5.1 AS INTEGER) |
خطأ | 5 |
قواعد الإكراه للنوع الضمني
ضمن ANSI_MODE = TRUE، يستخدم Databricks SQL قواعد تحويل نوع بيانات SQL واضحة ل:
على النقيض من ذلك ANSI_MODE = FALSE غير متناسق وأكثر تساهلا. على سبيل المثال:
- عند استخدام
STRINGنوع مع أي عامل تشغيل حسابي، يتم تحويل السلسلة ضمنيا إلىDOUBLE. - عند مقارنة
STRINGأي نوع رقمي، يتم تحويل السلسلة ضمنيا إلى النوع الذي تقارن به. - عند تنفيذ
UNIONCOALESCEأو أو أو عمليات أخرى حيث يجب العثور على نوع أقل شيوعا يتم تحويل كافة الأنواع إلىSTRINGإذا كان هناك أيSTRINGنوع موجود.
توصي Databricks باستخدام الدالة cast أو try_cast الصريحة بدلا من الاعتماد على ANSI_MODE = FALSE.
الأمثلة
> SET ansi_mode = true;
-- Protects against integral numeric overflow
> SELECT cast(12345 AS TINYINT);
Casting 12345 to tinyint causes overflow
-- For invalid values raises errors instead of returning NULL.
> SELECT cast('a' AS INTEGER);
Invalid input syntax for type numeric: a.
To return NULL instead, use 'try_cast'
-- try_cast() is consistent for both modes
> SELECT try_cast('a' AS INTEGER);
NULL
-- Does not allow ambiguous crosscasting.
> SELECT c1 + c2 FROM VALUES('5', '7.6') AS T(c1, c2);
Cannot resolve '(T.c1 + T.c2)' due to data type mismatch:
'(T.c1 + T.c2)' requires (numeric or interval day to second or interval year to month or interval) type, not string
-- Promotes STRING to least common type (STRING, INTEGER --> BIGINT) for arithmetic operation.
> SELECT typeof(5 - '3');
bigint
-- Promotes STRING to least common type (INTEGER, STRING --> BIGINT) with runtime check
> SELECT c1 = c2 FROM VALUES(10, '10.1') AS T(c1, c2);
Invalid input syntax for type numeric: 10.1. To return NULL instead, use 'try_cast'.
-- Promotes STRING to least common type (STRING, INTEGER --> BIGINT) for set operation with runtime check.
> SELECT typeof(c1) FROM (SELECT 5 UNION ALL SELECT '6') AS T(c1);
bigint
bigint
> SET ansi_mode = false;
-- Silent integral numeric overflow
> SELECT cast(12345 AS TINYINT);
57
-- Returns NULL instead of an error
> SELECT cast('a' AS INTEGER);
NULL
-- try_cast() is safe for both modes
> SELECT try_cast('a' AS INTEGER);
NULL
-- Does allow ambiguous crosscasting using DOUBLE.
> SELECT c1 + c2 FROM VALUES('5', '7.6') AS T(c1, c2);
12.6
-- Crosscasts STRING to DOUBLE for arithmetic operation.
> SELECT typeof(5 - '3');
double
-- Implicitly casts STRING to INTEGER equating 10 with 10.1
> SELECT c1 = c2 FROM VALUES(10, '10.1') AS T(c1, c2);
true
-- Promotes to string for set operations
> SELECT typeof(c1) FROM (SELECT 5 UNION ALL SELECT '6') AS T(c1);
string
string