JSON
JSON в MySQL і MariaDB не сумісні!
❗Тип JSON у MySQL зберігає об’єкт JSON у компактній формі, а не як LONGTEXT, як у MariaDB. Це означає, що реплікація на основі рядків не працюватиме для типів JSON із MySQL у MariaDB.
У MySQL JSON є об’єктом і порівнюється відповідно до значень json. У MariaDB рядки JSON є звичайними рядками та порівнюються як рядки. Одним винятком є використання JSON_EXTRACT(), у цьому випадку рядки не екрануються перед порівнянням.
Є кілька способів перемістити таблицю в MariaDB:
З версії MariaDB 10.5.7 ви можете використовувати плагін mysql_json. Див. Зробити MariaDB розумінням MySQL JSON.
Змініть стовпець JSON на тип TEXT у MySQL. Після цього MariaDB може безпосередньо використовувати таблицю без необхідності створювати дамп і відновлювати.
Використовуйте mysqldump, щоб скопіювати таблицю.
Конструкція
CREATE TABLE `tablename` (
`json_data` JSON DEFAULT NULL,
...
перетворюється (MariaDB) у таку:
CREATE TABLE `tablename` (
`json_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`json_data`)),
...
Python
❗ Якщо не перетворити об’єкт у json-рядок в поле типу JSON БД потрапить NULL
В базу:
json_field = json.dumps(json_obj, separators=(',',':'))
separators
(роздільники) мають бути кортежем (item_separator, key_separator)
. За замовчуванням: (',', ': ')
, якщо відступ indent не None
. Щоб отримати найбільш компактне представлення JSON, необхідно вказати (',', ':')
- без пробілів.
З бази:
if res[i].json_field is None:
json_obj = None
else:
json_obj = json.loads(res[i].json_field)
Last updated