ฉันกำลังพยายามลบที่เก็บข้อมูลชั่วคราวที่ใช้ร่วมกันสำหรับคีย์ที่มีขีดกลางหรือขีดกลาง
$keyword = '2020â2021';
$tempstore = \Drupal::service('tempstore.shared')->get('my_module_name');
$tempstore->delete($คำหลัก);
มันแสดงข้อยกเว้นนี้
Drupal\Core\Database\DatabaseExceptionWrapper: SQLSTATE[HY000]: ข้อผิดพลาดทั่วไป: 1267 การผสมการเรียงที่ผิดกฎหมาย (ascii_general_ci,IMPLICIT) และ (utf8mb4_general_ci,COERCIBLE) สำหรับการดำเนินการ '=': ลบจาก {key_value_expire} โดยที่ ("ชื่อ" ใน (:db_condition_placeholder_0)) และ ("collection" = :db_condition_placeholder_1);
Array ( [: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) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'คีย์ของคู่คีย์/ค่า';
ALTER TABLE `key_value_expire` CHANGE `collection` `collection` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ไม่เป็น NULL DEFAULT '' COMMENT 'ชุดของคู่คีย์และค่าที่มีชื่อ';