ผมมีปัญหาที่คล้ายกันก็พยายามที่จะใช้ขั้นตอน FIND_IN_SET กับสตริงตัวแปร
SET @my_var = 'string1,string2';
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);
และได้รับข้อผิดพลาด
รหัสข้อผิดพลาด: 1267 การเปรียบเทียบที่ผิดกฎหมาย (utf8_unicode_ci, IMPLICIT) และ (utf8_general_ci, IMPLICIT) สำหรับการดำเนินการ 'find_in_set'
คำตอบสั้น ๆ :
ไม่จำเป็นต้องเปลี่ยนตัวแปร collation_YYYY ใด ๆ เพียงเพิ่มการเปรียบเทียบที่ถูกต้องถัดจากการประกาศตัวแปรของคุณเช่น
SET @my_var = 'string1,string2' COLLATE utf8_unicode_ci;
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);
คำตอบยาว:
ฉันก่อนตรวจสอบตัวแปรการเรียง:
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
+----------------------+-----------------+
| collation_database | utf8_general_ci |
+----------------------+-----------------+
| collation_server | utf8_general_ci |
+----------------------+-----------------+
จากนั้นฉันตรวจสอบการเปรียบเทียบตาราง:
mysql> SHOW CREATE TABLE my_table;
CREATE TABLE `my_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`column_name` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=125 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ซึ่งหมายความว่าตัวแปรของฉันถูกกำหนดค่าด้วยเปรียบเทียบค่าเริ่มต้นของutf8_general_ciขณะที่โต๊ะของเราได้รับการกำหนดค่าเป็นutf8_unicode_ci
โดยการเพิ่มคำสั่ง COLLATE ถัดจากการประกาศตัวแปรการเปรียบเทียบตัวแปรที่ตรงกับการเรียงที่กำหนดค่าสำหรับตาราง