我有一个整理问题。它正在影响此表的3列,creation_date,product_id和lastmodified。
我已将列更改为utf8mb4,但他们不接受它。请参阅下文。
CREATE TABLE `users` (
`id` int(32) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`creation_date` datetime DEFAULT NULL,
`product_id` int(32) DEFAULT NULL,
`lastmodified` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=121 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
查询:
select * from users u where u.name like '%philėp%'
No errors, 1 row.
select * from users u where u.creation_date like '%philėp%'
Illegal mix of collations for operation 'like'
MySQL系统变量:
show variables like '%character_set%';
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8mb4
character_set_system utf8
当我手动强制MySQL转换语句中的列时,它确实有效。
select * from users u where CONVERT(u.creation_date USING utf8mb4) like '%philėp%'
No errors; 0 rows;
它已经不是utf8mb4格式吗?
感谢任何帮助。
答案 0 :(得分:3)
这是我的理解。
DATETIME 没有整理。
与 INT 的方式类似,因为它是一个数值
但是如果您查询(或插入) DATETIME ,则表示您正在使用以这种方式格式化的字符串。这意味着您可以在查询中的字符串与数据库中的 DATETIME 值之间进行隐式转换。
这是隐式转换,我认为这会导致问题。
此外,您正在使用带有下划线的 creation_date ,而不使用 lastmodified 。这应该 下划线或都没有。它与查询没有太大区别,但有助于维护您的数据库标准。