字符串的排序规则和数据类型不兼容

乔治·梅努蒂斯

在涉及归类和数据类型差异的情况下,我对系统的行为感到非常困惑。

作为最小的示例,我将相同的Unicode值输入到两个不同表的单列中。在一个表中,该列是varchar和的某种排序规则,在另一表中是nvarchar和另一种排序规则。代码和结果:

create table cn(code nvarchar(max) collate Latin1_General_CI_AS)
create table cv(code varchar(max) collate SQL_Latin1_General_CP1253_CI_AI)

insert cn select N'3VT18021δ'
insert cv select N'3VT18021δ'

select * from cn
select * from cv

--1. 
select * from cn inner join cv on cn.code=cv.code 
-- Cannot resolve the collation conflict between "SQL_Latin1_General_CP1253_CI_AI" and "Latin1_General_CI_AS" in the equal to operation.

--2. 
select * from cn inner join cv on cn.code=cv.code collate SQL_Latin1_General_CP1253_CI_AI   
-- returns one row

--3. 
select * from cn inner join cv on cn.code =cv.code collate Latin1_General_CI_AS 
-- returns 0 rows

--4. 
select * from cn inner join cv on cn.code collate SQL_Latin1_General_CP1253_CI_AI =cv.code   
-- returns one row

--5. 
select * from cn inner join cv on cn.code collate Latin1_General_CI_AS =cv.code 
-- returns one row

我的笔记:

情况1:我理解排序规则有所不同

情况2和5 :(正确)返回一行。为什么将字段归类为其自己的归类有好处?

案例3和4:为什么一次将一个排序规则转换为另一种排序规则,而不是另一种转换呢?

当然,所有这些由于数据类型的差异而变得更加复杂。

拉努

情况2和5 :(正确)返回一行。为什么将字段归类为其自己的归类有好处?

当你明确地使用COLLATE一个子句中的值两者表达的侧面明确地转换为整理,因此不存在冲突。

案例3和4:为什么一次将一个排序规则转换为另一种排序规则,而不是另一种转换呢?

您的一列是varchar,因此将其从一种排序规则更改为另一种排序规则时,其值也会更改。特别是当您COLLATE将表中的值cv归为collat​​ion时Latin1_General_CI_AS至于'δ'是不是在整理的可用角色varchar,变成一个'd''3VT18021d'相等N'3VT18021δ'您可以在下面看到它:

SELECT code COLLATE Latin1_General_CI_AS
FROM cv;

您需要将值显式转换为nvarcharfirst:

select *
from cn
     inner join cv on cn.code = CONVERT(nvarchar(MAX),cv.code) collate Latin1_General_CI_AS;
--Returns one row now

编辑:要解释为什么查询3并没有返回数据,查询5呢,这是因为定位的COLLATES和时隐式转换会发生。

cn.code =cv.code collate Latin1_General_CI_AS --3
cn.code collate Latin1_General_CI_AS =cv.code --5

对于查询3,COLLATE表达式为on cv.code,即varchar结果,该值的排序规则首先更改,并且字符'δ'丢失。然后nvarchar,由于数据类型优先级,它隐式转换为

但是,对于查询5,COLLATE上的cn.codenvarchar结果,当更改值的排序规则时,不会丢失任何字符。由于cv.code没有显式的COLLATE,因此首先将其转换为nvarchar(由于数据类型优先),然后再进行整理;不会丢失任何字符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java数据类型:字符串和数组

检查JavaScript中用于数组,对象,字符串和数字等数据类型的空值

Gridview排序方法-将数字作为字符串排序-如何更改数据类型

字符串、整数、数据类型

字符串-数据类型

将日期添加到字符串但得到:在添加运算符中,数据类型varchar(max)和date不兼容

使用qsort和strcmp对字符串进行C排序的数组-警告:指针类型不兼容

计算蜂巢中字符串类型的两列之间的时差,而不更改数据类型字符串

不兼容的类型字符串和字符

ORA-02267: 与引用列的数据类型或排序规则不兼容

数据类型标准条件表达式不匹配,字符串字段

不兼容的类型:字符串不能转换为 OnInitializationCompleteListener

不兼容的类型。小数不能转换为字符串

流型错误。对象类型与字符串不兼容

不兼容的类型卡无法转换为字符串

不兼容的类型pwidechar和字符串ShellExecute

字符串不兼容

如何确定作为字符串传递的数值的类型而不丢失数据或转换为错误的数据类型

二进制运算参数类型字符串与类型字符串不兼容

更新/修复列数据类型并记录字符串,以便在mysql innoDB数据库中按数字数据类型排序

将字符串更改为列表数据类型

按数据类型拆分R中的字符串

固定大小字符串的Postgres数据类型

Pandas DataFrame:减去字符串数据类型的列

从JavaScript中输入的字符串检查数据类型

弹性搜索查询字符串数据类型

熊猫联接字符串数据类型

从字符串到TimeStamp数据类型的转换

添加属性jQuery数据类型字符串+变量