專案問題總結2:GUID區分大小寫嗎?

連江偉發表於2015-06-29

問題描述:

最近在做專案的過程中,遇到一個問題,將從基礎系統查詢出來的課程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位的數字識別符號,那麼也許會很快的找到問題出在哪裡。

相關文章