Empty strings and NULLs
Depending on the context, an empty string ( ''
) can be considered as
NULL
or NOT NULL
.
Most SQL databases distinguish ''
empty strings from NULL
(with
some exceptions like Oracle® DB).
With Genero BDL character string variables, an empty string is the equivalent to
NULL
:MAIN
DEFINE vc10 VARCHAR(10)
LET vc10 = ''
DISPLAY (vc10 IS NULL) -- shows 1 / TRUE
END MAIN
When inserting an empty string SQL literal into a DB row, and fetching the value back into a
variable, the result might be null or non-null, depending on the database type and target variable
type, since CHAR
values are blank-padded.
See for example the following
code:
DEFINE rec RECORD
pk INTEGER,
c10 CHAR(10),
vc10 VARCHAR(10)
END RECORD
MAIN
-- CONNECT TO ... (your connection instruction goes here)
DISPLAY "DB driver: ", fgl_db_driver_type()
CREATE TEMP TABLE tt1 ( pk INT, c10 CHAR(10), vc10 VARCHAR(10) )
INSERT INTO tt1 VALUES ( 101, ' ', ' ' )
INSERT INTO tt1 VALUES ( 102, NULL, NULL )
INSERT INTO tt1 VALUES ( 103, '', '' )
SELECT tt1.* INTO rec.* FROM tt1 WHERE pk=101
CALL show_record()
SELECT tt1.* INTO rec.* FROM tt1 WHERE pk=102
CALL show_record()
SELECT tt1.* INTO rec.* FROM tt1 WHERE pk=103
CALL show_record()
END MAIN
FUNCTION show_record()
DISPLAY rec.pk, " [", NVL(rec.c10,"<NULL>"),"]",
COLUMN 30, "[",NVL(rec.vc10,"<NULL>"),"]"
END FUNCTION
Result with Informix IDS 14, PostgreSQ 12, MySQL 8.0, DB2
11.5:
DB driver: ifx
101 [ ] [ ]
102 [<NULL>] [<NULL>]
103 [ ] [<NULL>]
Result with Oracle DB
19c:
DB driver: ora
101 [ ] [ ]
102 [<NULL>] [<NULL>]
103 [<NULL>] [<NULL>]
Tip: Mixing empty strings and
NULL
values in database rows makes
queries more difficult: Is an empty string considered as null or not null by your application? To
avoid empty strings in database columns, always use program variables to insert data into SQL
tables: If a CHAR
or VARCHAR
program variable is assigned with an
empty string, it will be set to NULL
, and inserted as NULL
into
the database.