Încerc să șterg o stocare temporară partajată pentru o cheie care conține o liniuță en sau o liniuță em.
$keyword = '2020â2021';
$tempstore = \Drupal::service('tempstore.shared')->get('my_module_name');
$tempstore->delete($keyword);
Aruncă această excepție.
Drupal\Core\Database\DatabaseExceptionWrapper: SQLSTATE[HY000]: Eroare generală: 1267 Combinație ilegală de colații (ascii_general_ci,IMPLICIT) și (utf8mb4_general_ci,COERCIBLE) pentru operația „=”: DELETE FROM {key_value_expire} WHERE ("nume" ÎN (:db_condition_placeholder_0)) ȘI ("colecție" = :db_condition_placeholder_1);
Matrice ( [:db_condition_placeholder_0] => 2020â2021 [:db_condition_placeholder_1] => tempstore.shared.my_module_name ) în Drupal\Core\KeyValueStore\StorageBase->delete() (linia 52 din core/Coure/Drupal Core/Coure/Drupal /StorageBase.php).
Din câte îmi pot da seama, nu este o problemă cu baza de date, ci mai degrabă cu liniuțele en sau liniuțele em în cheia de stocare. Am încercat să scap de el Html::escape()
și utf8_encode()
, dar nu a rezolvat problema.
EDITAȚI | ×:
Am verificat care este colarea bazei de date locale și returnează UTF8.
mysql> SELECTARE DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
-> FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'drupal9';
+----------------------------+-------------------- ----+
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------------------+-------------------- ----+
| utf8 | utf8_general_ci |
+----------------------------+-------------------- ----+
EDIT2:
Rularea următoarelor interogări a rezolvat problema:
ALTER TABLE `key_value_expire` CHANGE `name` `name` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Cheia perechii cheie/valoare.';
ALTER TABLE `key_value_expire` CHANGE `collection` `collection` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'O colecție numită de perechi cheie și valoare.';