项目问题总结2:GUID区分大小写吗?

来源:互联网 发布:阿里云打印域名证书 编辑:程序博客网 时间:2024/06/05 15:38

问题描述:

最近在做项目的过程中,遇到一个问题,将从基础系统查询出来的课程ID作为参数去考评系统里查询考试信息,却什么也查不出来,调试了半天不知道什么原因。


问题分析:
静下心来思考一下,可以肯定程序代码逻辑以及实现是没有问题的,因此就是数据的问题了。那么数据出问题就应该是数据库的问题了,在进行单步调试的过程中,去检查各个变量以及参数的值,终于找到了问题出在哪里,先来看看两个系统的数据库存储CourseId的数据类型是什么吧,如下图:

上图中左边是基础的,右边是考试的。再来看看我的代码是如何实现问题描述里所说的过程吧:

想着想着就意识到一个问题,GUID是什么鬼??
于是百度了 一下:全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) 。GUID是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。GUID一词有时也专指微软对UUID标准的实现。
人家是数字标识符好不好,区分什么大小写啊!唉,读书少啊!不信,我们可以使用代码进行验证:
            //验证GUID是否区分大小写            Guid g1 = new Guid("6d025d37-a957-44b1-9e25-50d6bfd57a39");            Guid g2 = new Guid("6D025D37-A957-44B1-9E25-50D6BFD57A39");            Console.WriteLine(g1.Equals(g2));                   // 返回true            Console.WriteLine(Object.ReferenceEquals(g1, g2));  // 返回false            //使用tostring函数将GUID转换为string类型,观察他们的值            string strg1 = g1.ToString();            string strg2 = g2.ToString();            Console .WriteLine (strg1.Equals (strg2 ));  //返回true            Console.WriteLine(strg1);            Console.WriteLine(strg2);            //但是如果你的数据库存储类型为varchar,那就不一样了            string str1 = "6d025d37-a957-44b1-9e25-50d6bfd57a39";            string str2 = "6D025D37-A957-44B1-9E25-50D6BFD57A39";            Console.WriteLine(str1.Equals(str2));  //返回false            Console.Read();
而前面提到的uniqueidentifier,则是GUID在数据库里的存储类型,他们其实是一个东西。如此一来,就明朗了许多。

问题解决:
办法有两个:一个是让两者的数据库的数据类型保持一致,这是根本上的解决之道;如果不想修改数据库的话,可以接着使用varchar的数据类型去存储GUID的字符串,但是要保证其必须是字母小写的格式,否则在根据其字段值进行查询的时候,字符串是无法和guid的ToString()方法产生的字符串进行匹配的,因此查询结果肯定不正确,建议还是统一数据类型吧。

小结 一下:
其实仔细想想还是基础性的东西不扎实,我根本不知道GUID的概念,因此才会有标题所述的疑问。如果我清楚的知道GUID是一种由算法生成的二进制长度为128位的数字标识符,那么也许会很快的找到问题出在哪里。
1 0