Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用utf8mb4在MySQL中通过表情符号进行搜索?_Mysql_Sql_Emoji_Utf8mb4 - Fatal编程技术网

如何使用utf8mb4在MySQL中通过表情符号进行搜索?

如何使用utf8mb4在MySQL中通过表情符号进行搜索?,mysql,sql,emoji,utf8mb4,Mysql,Sql,Emoji,Utf8mb4,请帮助我理解MySQL utf8mb4字段中如何处理表情符号等多字节字符 请参见下面的一个简单的SQL测试来说明这些挑战 /*清除以前的测试*/ 删除表(如果存在)`emoji_test`; 删除表(如果存在)`emoji\u test\u with_unique\u key`; /*构建模式*/ 创建表'emoji_test`( `id`int(11)非空自动增量, `字符串“varchar(191)字符集utf8mb4 COLLATE utf8mb4\u unicode\u ci NOT N

请帮助我理解MySQL utf8mb4字段中如何处理表情符号等多字节字符

请参见下面的一个简单的SQL测试来说明这些挑战

/*清除以前的测试*/
删除表(如果存在)`emoji_test`;
删除表(如果存在)`emoji\u test\u with_unique\u key`;
/*构建模式*/
创建表'emoji_test`(
`id`int(11)非空自动增量,
`字符串“varchar(191)字符集utf8mb4 COLLATE utf8mb4\u unicode\u ci NOT NULL默认值”,
`状态'tinyint(1)非空默认值'1',
主键(`id`)
)ENGINE=InnoDB默认字符集=utf8mb4;
使用“唯一”键创建表“表情测试”(
`id`int(11)非空自动增量,
`字符串“varchar(191)字符集utf8mb4 COLLATE utf8mb4\u unicode\u ci NOT NULL默认值”,
`状态'tinyint(1)非空默认值'1',
主键(`id`),
使用BTREE的唯一键'idx\u string\u status'('string','status')
)ENGINE=InnoDB默认字符集=utf8mb4;
/*插入数据*/
#预期的结果是成功插入其中的每一个。
#然而,有些失败了。见评论。

插入emoji_测试(`string`、`status`)值(您对列使用
utf8mb4_unicode_ci
,因此检查不区分大小写。如果您使用
utf8mb4_bin
,那么任何墨西哥人都可以告诉您,emoji相关::解决方案是使用MySQL 5.6+和utf8mb4_unicode_520_ci排序规则,这不会将所有4个字节字符视为相等-这是一个很好的理由o避免使用表情符号作为密码:)@ÁlvaroGonzález如果这是密码的问题,那么给定的设置就有一个更大的问题,因为密码应该用单向散列来存储。对于散列,这不应该是问题。但我也不建议将其用于密码。这是难以置信的。在中将编码切换到
utf8mb4_bin
上面的de>CREATE TABLE
s使其余的测试查询完全按照预期工作。非常感谢。如果对此有进一步的了解,我们将不胜感激。难怪二进制排序可以解决这个问题(这就是它的目的)但我不明白为什么两个完全不同的表情符号会被视为同一个字符的大小写变体。我怀疑这是故意的。@阿尔瓦罗冈萨雷斯一个相似的原因,为什么
a
是相同的,即使它们可能有不同的发音和意思。我的第一个想法是,它们是它们被视为相等,因为它们都属于食品类别,但更可能的是,
ci
只是检查它们是否是表情符号。因此……排序数据库没有关于它们的信息,因此它们被分配了一个通用的共同权重,从而变得“相等”?8.0将引入基于UCA 9.0.0的
utf8mb4_0900_ai_ci