Oracle 12c introduced JSON in the database and one of the most recent additions is a function to compare JSON, JSON_EQUAL.
From the documentation:
Oracle recommends that you use BLOB storage.When I first learned about this recommendation it surprised me. Looking at a BLOB doesn't even remotely look like JSON, so how does JSON_EQUAL deal with a comparison between a BLOB and a string?
I mean how does this:
7B2274686973223A2274686174227Dcompare to this:
{"testing":"information"}Let's try and find out.
create table t (json_data blob) / insert into t values ( utl_raw.cast_to_raw ( '{"testing":"information"}' ) );
select case when json_equal (json_data, '{"testing":"information"}') then 'same' else 'different' end as result from t / RESULT --------- same
select case when json_equal (json_data, '{"testing":"different"}') then 'same' else 'different' end as result from t / RESULT ---------- differentHow cool is that?
Later I learned from Chris Saxon about the reason behind the BLOB recommendation: it avoids character set conversions!
So, there are no excuses for not using BLOB as your default choice when storing JSON documents.