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

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

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字段包含了各种字符串,包括带有表情符号的字符串。

在 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

本文版权归作者所有,未经作者同意不得转载。

相关推荐
海奥华27 小时前
SQLEXPLAIN 详解
数据库·mysql
情深不寿3178 小时前
MySQL————数据库基础
数据库·mysql
程序新视界8 小时前
如何选择合适的数据库?PostgreSQL与MySQL各项对比
数据库·mysql·postgresql
dongchen。11 小时前
MySQL第一次作业
数据库·mysql
重生之我是Java开发战士12 小时前
【MySQL】数据库基础
数据库·mysql
ChuHsiang12 小时前
【剑指MySQL】数据库基础(1)
数据库·mysql
九皇叔叔13 小时前
Docker 镜像维护指南:从配置优化到 MySQL 实战运行
mysql·adb·docker
muxin-始终如一13 小时前
MySQL分区分表实现方法详解
数据库·mysql·adb
奥尔特星云大使13 小时前
mysql高可用架构之MHA部署(三)——故障转移后邮件告警配置(保姆级)
mysql·dba·高可用·mha·邮件告警
disanleya14 小时前
MySQL时间格式转换,时间数据混乱不堪如何彻底重构?
数据库·mysql·重构