Я пытаюсь удалить общее временное хранилище для ключа, содержащего короткое тире или длинное тире.
$keyword = '2020–2021';
$tempstore = \Drupal::service('tempstore.shared')->get('my_module_name');
$tempstore->удалить($ключевое слово);
Он выдает это исключение.
Drupal\Core\Database\DatabaseExceptionWrapper: SQLSTATE [HY000]: Общая ошибка: 1267 Недопустимое сочетание сопоставлений (ascii_general_ci, IMPLICIT) и (utf8mb4_general_ci, COERCIBLE) для операции '=': УДАЛИТЬ ИЗ {key_value_expire} ГДЕ ("имя" В (:db_condition_placeholder_0)) И ("коллекция" = :db_condition_placeholder_1);
Массив ( [:db_condition_placeholder_0] => 2020–2021 [:db_condition_placeholder_1] => tempstore.shared.my_module_name ) в Drupal\Core\KeyValueStore\StorageBase->delete() (строка 52 core/lib/Drupal/Core/KeyValueStore /StorageBase.php).
Насколько я могу судить, проблема не в базе данных, а в том, что в ключе хранилища есть короткие или длинные тире. Я пытался избежать этого с помощью Html:: побег()
и utf8_encode()
, но это не решило проблему.
РЕДАКТИРОВАТЬ:
Я проверил, какова моя локальная сортировка базы данных, и она возвращает UTF8.
mysql> ВЫБЕРИТЕ DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
-> ИЗ INFORMATION_SCHEMA.SCHEMATA, ГДЕ SCHEMA_NAME = 'drupal9';
+------------------------------------ ----+
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+------------------------------------ ----+
| utf8 | utf8_general_ci |
+------------------------------------ ----+
РЕДАКТИРОВАТЬ2:
Выполнение следующих запросов устранило проблему:
ALTER TABLE `key_value_expire` CHANGE `name` `name` VARCHAR(128) НАБОР СИМВОЛОВ utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Ключ пары ключ/значение.';
ALTER TABLE `key_value_expire` CHANGE `коллекция` `коллекция` VARCHAR(128) НАБОР СИМВОЛОВ utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Именованная коллекция пар ключ-значение.';