admin

MySQL排序操作出现LIKE问题

sql

我有一个整理问题。它会影响该表的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格式吗?

将不胜感激。


阅读 222

收藏
2021-06-07

共1个答案

admin

这是我的理解。

一个 DATETIME 没有整理。

类似于 INT 并非由于其为数字值而导致的情况

但是,如果您查询(或插入)到 DATETIME* ,则使用的是以这种方式设置格式的字符串。这意味着可以在查询中的字符串和数据库中的
DATETIME 值之间进行 隐式 转换。
*

我认为正是这种 隐式 转换导致了这里的问题。

另外,您正在使用带有下划线的 creation_date ,而没有使用 lastlast 。确实应该 同时使用 下划线或
使用 下划线。它对查询的影响不大,但可以帮助您维护数据库标准。

2021-06-07