Technology News

How to Use JSON Data Fields in MySQL Databases

How to Use JSON Data Fields in MySQL Databases

My article “SQL vs NoSQL: The Differences” noted that the line between SQL and NoSQL databases has become increasingly blurred, with each camp adopting features from the other. MySQL 5.7+ InnoDB databases and PostgreSQL 9.2+ both directly support JSON document types in a single field. In this article, we’ll examine the MySQL 8.0 JSON implementation in more detail.

Note that any database will accept JSON documents as a single string blob. However, MySQL and PostgreSQL support validated JSON data in real key/value pairs rather than a basic string.

Just Because You Can Store JSON …

… it doesn’t follow you should.

Normalization is a technique used to optimize the database structure. The First Normal Form (1NF) rule governs that every column should hold a single value — which is clearly broken by storing multi-value JSON documents.

If you have clear relational data requirements, use appropriate single-value fields. JSON should be used sparingly as a last resort. JSON value fields can’t be indexed, so avoid using it on columns which are updated or searched regularly. In addition, fewer client applications support JSON and the technology is newer, so it could be less stable than other types.

That said, there are good JSON use cases for sparsely populated data or custom attributes.

Create a Table With a JSON Field

Consider a shop selling books. All books have an ID, ISBN, title, publisher, number of pages and other clear relational data. Presume you want to add any number of category tags to each book. You could achieve this in SQL using:

  1. a tag table which stored each tag name with a unique ID, and
  2. a tagmap table with many-to-many records mapping book IDs to tag IDs

It’ll work, but it’s cumbersome and considerable effort for a minor feature. Therefore, you can define a tags JSON field in your MySQL database’s book table:

CREATE TABLE `book` ( `id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(200) NOT NULL, `tags` JSON DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB; 

Note that JSON columns can’t have a default value, be used as a primary key, be used as a foreign key, or have an index. You can create secondary indexes on generated virtual columns, but it’s easier and more practical to retain a value in a separate field if indexes are required.

Adding JSON Data

Whole JSON documents can be passed in INSERT or UPDATE statements. For example, our book tags can be passed as an array (inside a string):

INSERT INTO `book` (`title`, `tags`) VALUES ( 'ECMAScript 2015: A SitePoint Anthology', '["JavaScript", "ES2015", "JSON"]' ); 

JSON can also be created with these:

  • JSON_ARRAY() function, which creates arrays. For example:

    -- returns [1, 2, "abc"]: SELECT JSON_ARRAY(1, 2, 'abc'); 
  • JSON_OBJECT() function, which creates objects. For example:

    -- returns {"a": 1, "b": 2}: SELECT JSON_OBJECT('a', 1, 'b', 2); 
  • JSON_QUOTE() function, which quotes a string as a JSON value. For example:

    -- returns "[1, 2, "abc"]": SELECT JSON_QUOTE('[1, 2, "abc"]'); 
  • or you can (CAST anyValue AS JSON).

The JSON_TYPE() function allows you to check JSON value types. It should return OBJECT, ARRAY, a scalar type (INTEGER, BOOLEAN, etc), NULL, or an error. For example:

-- returns ARRAY: SELECT JSON_TYPE('[1, 2, "abc"]'); -- returns OBJECT: SELECT JSON_TYPE('{"a": 1, "b": 2}'); -- returns an error: SELECT JSON_TYPE('{"a": 1, "b": 2'); 

The JSON_VALID() function returns 1 if the JSON is valid or 0 otherwise:

-- returns 1: SELECT JSON_TYPE('[1, 2, "abc"]'); -- returns 1: SELECT JSON_TYPE('{"a": 1, "b": 2}'); -- returns 0: SELECT JSON_TYPE('{"a": 1, "b": 2'); 

Attempting to insert an invalid JSON document will raise an error and the whole record will not be inserted/updated.

Continue reading How to Use JSON Data Fields in MySQL Databases on SitePoint.

How To Use PuTTY SSH With cPanel®
Disney thought the pandemic would have eased up by May. It has changed its mind.

Related Articles

Habits of Successful HR Departments

habits-of-successful-hr-departments
Great HR departments do a little of everything— they coordinate with the CEO on salaries and hiring, pick out the snacks in the break room, help the new hire who’s…

Embrace the Platform

Embrace the Platform
So what is the one thing that people can do is to make their website better? To answer that, let’s take a step back in time … The year is…

So, you want to democratize venture capital

so-you-want-to-democratize-venture-capital
A venture capitalist once told me candidly that whenever you see the phrase “democratization” in tech marketing material, think of it as a red flag. Democracy, generally speaking, often comes…