В клиентском терминале MySQL следующее работает нормально:
Код: Выделить всё
mysql> ALTER TABLE digilearning_support_files ADD INDEX metadata_json_category (( CAST(metadata_json->>"$.category" as CHAR(255)) COLLATE utf8mb4_bin )) USING BTREE;
Query OK, 0 rows affected (0.19 sec)
Records: 0 Duplicates: 0 Warnings: 0
Код: Выделить всё
mysql> EXPLAIN SELECT * FROM digilearning_support_files WHERE metadata_json->>"$.category" = 'Lesson Plan'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: digilearning_support_files
partitions: NULL
type: ref
possible_keys: metadata_json_category
key: metadata_json_category
key_len: 1023
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
Я написал вспомогательный метод для запуска миграции Rails, чтобы настроить индекс таким образом. Но когда он запускается в Rails, он жалуется на параметры сортировки:
Код: Выделить всё
>> ActiveRecord::Base.connection.execute("ALTER TABLE digilearning_support_files ADD INDEX metadata_json_category (( CAST(metadata_json->>\"$.category\" as CHAR(255)) COLLATE utf8mb4_bin )) USING BTREE")
ActiveRecord::StatementInvalid: Mysql::Error: COLLATION 'utf8mb4_bin' is not valid for CHARACTER SET 'utf8mb3': ALTER TABLE digilearning_support_files ADD INDEX metadata_json_category (( CAST(metadata_json->>"$.category" as CHAR(255)) COLLATE utf8mb4_bin )) USING BTREE
В качестве эксперимента я изменил запрос Rails, чтобы вместо него использовать utf8mb3_bin. Это позволило мне добавить индекс, но EXPLAIN сообщает, что не будет его использовать, и я почти уверен, что это неправильное значение для JSON.
Подробнее здесь: https://stackoverflow.com/questions/798 ... he-same-qu
Мобильная версия