Я могу добавить индекс приведения столбца JSON в MySQL, но не в Rails, используя тот же запрос.MySql

Форум по Mysql
Anonymous
Я могу добавить индекс приведения столбца JSON в MySQL, но не в Rails, используя тот же запрос.

Сообщение Anonymous »

Я добавил столбец формата JSON Metadata_json в таблицу базы данных digilearning_support_files и пытаюсь создать индекс для значения, которое будет там храниться.
В клиентском терминале 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
и я вижу, что он будет использоваться с запросом EXPLAIN:

Код: Выделить всё

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)
Итак, EXPLAIN показывает, что он будет использовать этот индекс для проверки значения ключа «категория» в сохраненном JSON. Пока все хорошо.
Я написал вспомогательный метод для запуска миграции 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
Почему клиент MySQL доволен этим, а не тем, что тот же SQL-запрос выполняется в Rails?
В качестве эксперимента я изменил запрос Rails, чтобы вместо него использовать utf8mb3_bin. Это позволило мне добавить индекс, но EXPLAIN сообщает, что не будет его использовать, и я почти уверен, что это неправильное значение для JSON.

Подробнее здесь: https://stackoverflow.com/questions/798 ... he-same-qu

Вернуться в «MySql»