一个关于空格的Sql Server面试题

引子

先上题目:

回答下面sql 的输出结果

declare @s1 varchar(10)

declare @s2 varchar(10)

set @s1='a b'

set @s2='a b'

if @s1=@s2 select 'true'

答案是 true

那么上面的 s1 和 s2 是否相等的呢?

我们再看看下面的sql

sql 复制代码
declare @s1 varchar(10)
declare @s2 varchar(10)
set @s1='A b'
set @s2='A b'  
if @s1=@s2 select 'true' 

答案也是 true

这道面试题的目的是以题目为契机,引出数据库下面的知识点:

1、字符串字段

2、排序规则

3、排序规则和相等的关系

分析

我们开始分析s1 和 s2 这俩字符串。他们是否相等,如果我们用c++、delphi、C# 等语言来判断,显示是不等,但是在sql server中,有时候是相等的(如上图)。

sql server 和 c++、delphi、C# 的运算 结果不一样,他们之中谁错了?

他们都没有错,因为他们都是按照自己的规则运算的。c++、delphi、C#等语言是字符串处理,俺就不谈了,C++的字符串操作可以写半本书。

我们先从 sql server的字符串类型开始说,sql server的字符串类型常用的有:

  • char(32)
  • varchar(31)
  • nchar(31)
  • nvarchar(31)
  • text
  • varchar(max)
  • nvarchar(max)

除了类型之外,还要一个需要的注意的就是排序规则。

执行SELECT DATABASEPROPERTYEX('master', 'Collation')

在Chinese_PRC_CI_AS下,上面的s1 和 s2 的每个字符的排序是一致的,所以 sql server 认为 s1 和 s2 是相等的。由此可以看出,在 sql server 中的字符串比较是按照Chinese_PRC_CI_AS进行计算的。

另:Chinese_PRC_CI_AS

Chinese_PRC_CI_AS,前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则。

排序规则的后半部份即后缀 含义:

_BIN: binary sort 二进制排序

_BIN2:binary code point comparison sort

_AS、_WS等选项的字母代表的意义如下:

C:case,大小写

A:accent,重音

K:kanatype,假名

W:width,宽度

I:insensitive, 不敏感,不区分

S:sensitive,敏感,区分

如 CI 就是case-insensitive,不区分大小写。

更详细说明:

_CI(CS) :是否区分大小写,CI不区分,CS区分。

_AI(AS) :是否区分重音,AI不区分,AS区分。

_KI(KS) :是否区分假名类型,KI不区分,KS区分。

_WI(WS) :是否区分宽度 WI不区分,WS区分。

提示说明:

区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。

区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项。比较还将重音不同的字母视为不等。

区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项。

相关推荐
向宇it38 分钟前
【unity组件介绍】URP Decal Projector贴花投影器,将特定材质(贴花)投影到场景中的其他对象上。
游戏·3d·unity·c#·游戏引擎·材质
scheduleTTe9 小时前
SQL增查
数据库·sql
斯是 陋室9 小时前
在CentOS7.9服务器上安装.NET 8.0 SDK
运维·服务器·开发语言·c++·c#·云计算·.net
inwith11 小时前
C#语法基础总结(超级全面)(二)
开发语言·c#
ヾChen15 小时前
13届蓝桥杯省赛程序设计试题
物联网·学习·蓝桥杯·c#
SoFlu软件机器人18 小时前
告别手动报表开发!描述数据维度,AI 自动生成 SQL 查询 + Java 导出接口
java·数据库·sql
我是唐青枫19 小时前
C#.NET 泛型详解
开发语言·c#·.net
Yasin Chen20 小时前
C# StringBuilder源码分析
开发语言·c#
格林威21 小时前
Baumer工业相机堡盟工业相机如何通过YoloV8模型实现人物识别(C#)
开发语言·人工智能·数码相机·yolo·计算机视觉·c#
Rabbb21 小时前
C# JSON 反序列化时,忽略转换失败的属性 JTokenSafeToExtensions
后端·c#·json