我有一个整理问题。它会影响该表的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格式吗?
将不胜感激。
这是我的理解。
一个 DATETIME 没有整理。
类似于 INT 并非由于其为数字值而导致的情况
但是,如果您查询(或插入)到 DATETIME* ,则使用的是以这种方式设置格式的字符串。这意味着可以在查询中的字符串和数据库中的 DATETIME 值之间进行 隐式 转换。 *
我认为正是这种 隐式 转换导致了这里的问题。
另外,您正在使用带有下划线的 creation_date ,而没有使用 lastlast 。确实应该 同时使用 下划线或 不 使用 下划线。它对查询的影响不大,但可以帮助您维护数据库标准。