Я могу добавить индекс приведения столбца 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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