Tôi đang cố xóa bộ nhớ tạm thời dùng chung cho một khóa có chứa dấu gạch ngang hoặc dấu gạch ngang em.
$keyword = '2020â2021';
$tempstore = \Drupal::service('tempstore.shared')->get('my_module_name');
$tempstore->delete($keyword);
Nó ném ngoại lệ này.
Drupal\Core\Database\DatabaseExceptionWrapper: SQLSTATE[HY000]: Lỗi chung: 1267 Kết hợp đối chiếu bất hợp pháp (ascii_General_ci,IMPLICIT) và (utf8mb4_General_ci,COERCIBLE) cho thao tác '=': XÓA TỪ {key_value_expire} WHERE ("tên" VÀO (:db_condition_placeholder_0)) VÀ ("bộ sưu tập" = :db_condition_placeholder_1);
Mảng ( [:db_condition_placeholder_0] => 2020â2021 [:db_condition_placeholder_1] => tempstore.shared.my_module_name ) trong Drupal\Core\KeyValueStore\StorageBase->delete() (dòng 52 của core/lib/Drupal/Core/KeyValueStore /StorageBase.php).
Theo như tôi có thể nói, đó không phải là vấn đề với cơ sở dữ liệu, mà là do có dấu gạch ngang hoặc dấu gạch ngang trong khóa lưu trữ. Tôi đã cố gắng thoát khỏi nó với Html::thoát()
và utf8_encode()
, nhưng nó không giải quyết được vấn đề.
CHỈNH SỬA:
Tôi đã kiểm tra đối chiếu cơ sở dữ liệu cục bộ của mình là gì và nó trả về UTF8.
mysql> CHỌN DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
-> TỪ THÔNG TIN_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'drupal9';
+---------------------------------- +--------- ----+
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+---------------------------------- +--------- ----+
| utf8 | utf8_General_ci |
+---------------------------------- +--------- ----+
CHỈNH SỬA2:
Việc chạy các truy vấn sau đã khắc phục sự cố:
ALTER TABLE `key_value_expire` THAY ĐỔI `name` `name` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_General_ci NOT NULL DEFAULT '' COMMENT 'Khóa của cặp khóa/giá trị.';
ALTER TABLE `key_value_expire` CHANGE `collection` `collection` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_General_ci NOT NULL DEFAULT '' COMMENT 'Một tập hợp các cặp khóa và giá trị được đặt tên.';