NULL luôn là một thứ gây bối rối, mặc dù ý tưởng của nó chỉ đơn giản là một giá trị cho biết là chỗ này chưa có dữ liệu. Có một số cái lạ nữa như là truy vấn thì luôn dùng IS NULL chứ không dùng = NULL. Tuy nhiên ORACLE đối xử với NULL một cách dị hợm hơn chuẩn thông thường. Hơn nữa cách index trên NULL còn tiếp tục khác biệt.
Theo chuẩn thông thường, NULL được định nghĩa là chưa có dữ liệu, hoặc dữ liệu chưa xác định. Nghĩa là không có giá trị nào = NULL. Tuy nhiên ORACLE lại khác nó coi empty string là NULL
SELECT '0 IS NULL???' AS "what is NULL?" FROM dual WHERE 0 IS NULL
UNION ALL SELECT '0 is not null' FROM dual WHERE 0 IS NOT NULL
UNION ALL SELECT ''''' IS NULL???' FROM dual WHERE '' IS NULL
UNION ALL SELECT ''''' is not null' FROM dual WHERE '' IS NOT NULL
Đây là kết quả
what is NULL? |
---|
0 is not null |
'' IS NULL??? |
Với tâm lý thích làm Dev phải băn khoăn, Oracle còn cho NULL là empty string luôn
SELECT 1 , 1 || '' , 1 || NULL FROM dual
Kết quả
Trong khi ở db khác nó sẽ thế này
Về cơ bản khác db khác mà có quan hệ với NULL sẽ là NULL nhưng oracle thì không như vậy. Thường thì ở mọi ngôn ngữ lập trình empty string sẽ không bao giờ là NULL. Ngoại trừ ... Oracle Database. Nên là trong thực tế không thể nào lưu giá trị empty string với kiểu VARCHAR2. Nếu bạn cố lưu thì Oracle đơn giản chỉ lưu NULL vào đó.
Cái đặc thù này không những lạ mà còn nguy hiểm. Và điều này còn tiếp tục của phần index nữa và mình sẽ nói ở những bài sau nhé!