数据库中查询含有某个emoji表情的行数据

文摘   2024-10-12 09:00   广东  

作者:桦仔 

10余年DBA工作经验,

微信:debolop

QQ交流群:740052625

公众号:数据库实战派



背景

在现代数据库应用中,处理带有表情符号(emoji)的文本数据已成为常见需求,特别是在社交媒体、聊天系统等领域。由于表情符号属于Unicode字符的一部分,在不同的数据库系统中,处理这种字符的方式有所不同。

MySQL 和 SQL Server 都支持 Unicode 字符的处理,但由于字符集和排序规则(collation)的差异,在执行查询时,字符串比较的方式也会不同。例如,在 MySQL 中,使用 utf8mb4 字符集时可以直接通过 = 操作符进行表情符号的比较,但也可以使用 BINARY 关键字进行逐字节的二进制比较。同样地,SQL Server 提供了 CAST 函数以二进制方式进行精确的字节比较。

MySQL的情况

代码如下


create table tt6(id int, name varchar(800));
insert into tt6 select 1, '121😊33';
insert into tt6 select 2, 'ddd';
insert into tt6 select 3, '3669Ef';

select * from tt6

同样,name字段包含了各种字符串,包括带有表情符号的字符串。

现在我们直接进行比较

SELECT * FROM tt6 WHERE name = '121😊33';
SELECT * FROM tt6 WHERE BINARY name = '121😊33';

在 MySQL 中,varchar 或 char 列在使用 utf8mb4 字符集时,支持大部分 Unicode 字符,并且默认比较是基于字符集和排序规则的。这意味着你可以直接使用 = 操作符进行字符串比较。

SELECT * FROM tt6 WHERE name = '121😊33';
这样的查询基于默认的排序规则来进行比较。

另外,MySQL 提供了 BINARY 关键字,可以将字符串转换为二进制格式来进行逐字节比较。

SELECT * FROM tt6 WHERE BINARY name = '121😊33';
这样的查询会忽略排序规则,直接比较每个字符的字节值。

当然,MySQL在这里同样有一个优化,就是当你输入BINARY name 时候,告诉优化器等号两边都用字节比较,数据库自动将等号右边的数值转为字节。

SQL Server的情况

代码如下


create table tt6(id int, name nvarchar(800));
insert into tt6 select 1, '121😊33';
insert into tt6 select 2, 'ddd';
insert into tt6 select 3, '3669Ef';

select * from tt6

在这个表中,name字段包含了各种字符串,包括带有表情符号的字符串。


SELECT *FROM tt6 WHERE name =  '121😊33'

SELECT*FROM tt6 WHERE CAST(name AS BINARY)= '121😊33'

在 SQL Server 中,当你使用 nvarchar 或 varchar 数据类型进行比较时,数据库会按照列的排序规则(collation)来进行比较和处理Unicode字符。

这种比较方式通常考虑了字符的语义。

SELECT * FROM tt6 WHERE name = '121😊33';
这样的查询会根据列的排序规则进行比较。另外,SQL Server 提供了 CAST(... AS BINARY) 的方式将字符串转换为二进制数据进行比较,这样也可以确保比较的是字符串的字节级别的值。

SELECT * FROM tt6 WHERE CAST(name AS BINARY) = '121😊33'; 

这样的查询会逐字节进行比较,以确保精确匹配。

当然,SQL Server在这里有一个优化,就是当你输入where cast(name as binary) 时候,告诉优化器等号两边都用字节比较,数据库自动将等号右边的数值转为字节,而不需要你在等号右边写CAST('121😊33' as binary);

总结

在 SQL Server 和 MySQL 中,既可以使用二进制比较,也可以直接进行字符串比较,这是因为两者都提供了不同层次的比较方式以满足不同的需求。

字符串比较和二进制比较的基本概念

  • 字符串比较:通常情况下,字符串比较是基于字符集和排序规则(collation)的。它在比较字符时考虑了字符的语义(如大小写敏感性、重音符号等),而不是简单的字节序列。
  • 二进制比较:二进制比较则是逐字节进行的,完全基于每个字符的实际二进制值。这种比较方式忽略了字符集的排序规则,只关注字符的字节表示。



参考文章

https://blog.sqlauthority.com/2020/02/28/sql-server-displaying-smiley-in-ssms-emoji/ https://www.reddit.com/r/SQL/comments/fasio7/sql_server_supports_emoji_in_identifier_names/?rdt=40804 https://www.genelify.com/blog/how-to-store-emoji-into-mysql-database#google_vignette https://www.codeproject.com/Questions/5354414/How-to-store-emojis-in-a-mysql-table-Tried-everyth




加入我们的微信群,与我们一起探讨数据库技术,以及SQL Server、 MySQL、PostgreSQL、MongoDB 的相关话题。

微信群仅供学习交流使用,没有任何广告或商业活动。

数据库实战派
泰莱大学人工智能专业硕士,专注数据库技术解析,涵盖主流数据库的优化、运维与开发技巧。分享最新技术趋势、实用工具和最佳实践,助力从业者提升专业能力。
 最新文章