zoukankan      html  css  js  c++  java
  • Guid排序问题

    网上参考,论坛之类,下面是粘贴的原话。

    在数据库中执行SQL并对GUID列升序排序,结果为:
    FA22DA92-DA37-46B6-99EA-09BDCDFCDBB3
    E23CADA8-542C-4D83-865D-FA279BDA904F
    而在C#中,用DataTable.DefaultView.Sort排序时得到的结果如下: 
    E23CADA8-542C-4D83-865D-FA279BDA904F
    FA22DA92-DA37-46B6-99EA-09BDCDFCDBB3
    二种排序结果正好相反,不解其意,望高手回答。
    注:DataTable中的列类型为GUID,和数据库列数据类型相同!

    declare @guid1 uniqueidentifier
    declare @guid2 uniqueidentifier
    
    set @guid1 = 'FA22DA92-DA37-46B6-99EA-09BDCDFCDBB3'
    set @guid2 = 'E23CADA8-542C-4D83-865D-FA279BDA904F'
    
    
    select @guid1 id union
    select @guid2 
    order by id
    
    结果:
    FA22DA92-DA37-46B6-99EA-09BDCDFCDBB3
    E23CADA8-542C-4D83-865D-FA279BDA904F
    
    -------------------------------------------------
    select @guid1 id union
    select @guid2 
    order by id desc
    
    结果:
    E23CADA8-542C-4D83-865D-FA279BDA904F
    FA22DA92-DA37-46B6-99EA-09BDCDFCDBB3
    

      在数据库中,我们用的guid是16字节,它的存储方式是二进制。
    我们看到的只是它的字符串格式,例如
    字符串格式: '6F9619FF-8B86-D011-B42D-00C04FC964FF'
    ---------------------------------------------------
    而实际上它的存储格式为二进制,例如:
    二进制格式: 0xff19966f868b11d0b42d00c04fc964ff
    这样我们在sql中排序的时候其实是按二进制格式来排序的,而不是字符串格式。
    这样我们在C#中是按字符串格式排序的。

    比较奇怪的是C#中DataView中的列是GUID类型的列,排序时也应该按照十六进制进行排序,而不是按照字符串排序,看来可能是.net的BUG,感谢大家的回答!

  • 相关阅读:
    无废话WPF系列9: Binding的源
    无废话WPF系列7:WPF布局控件
    无废话WPF系列6:各类控件家族详解
    无废话WPF系列13:路由事件
    无废话WPF系列4: x名称空间
    无废话WPF系列12: 依赖属性和附加属性
    用C++设计一个不能被继承的类
    HMM的介绍及实现
    C语言综合实验3—计算器四则运算
    机器学习基础
  • 原文地址:https://www.cnblogs.com/YoungPop-Chen/p/3259864.html
Copyright © 2011-2022 走看看