SQL Server GUID 數據遷移至MongoDB後怎樣查看?

来源:https://www.cnblogs.com/xuliuzai/archive/2019/01/12/10257695.html
-Advertisement-
Play Games

關鍵字:SQL Server NEWID();BSON;MongoDB UUID 1.遇到的問題和困惑 SQL Server中的NEWID數據存儲到MongoDB中會是什麼樣子呢?發現不能簡單的通過此數據查詢了。 例如我們將SQL Server 資料庫中的QQStatements2019表遷移至Mo ...


關鍵字:SQL Server NEWID();BSON;MongoDB UUID

1.遇到的問題和困惑

 SQL Server中的NEWID數據存儲到MongoDB中會是什麼樣子呢?發現不能簡單的通過此數據查詢了。

例如我們將SQL Server 資料庫中的QQStatements2019表遷移至MongoDB 中,集合命名也為QQStatements2019。

在SQL Server中選擇4個OrderId,數據作為演示實例,查看如下:

 

經過程式轉換後,在mongodb的客戶端工具nosqlbooster上查看。

此時沒有文檔。

但是查看文檔數據量,SQL Server 和 MongoDB 二者一致,說明確實導入成功了。

問題出在哪兒?難得數據失真了?如果是失真的話?是只有這一個欄位失真還是全部欄位失真?

我們用這些Orderid對應的SerialNumber數據去MongoDB中查詢驗證下。

現在SQL Server資料庫中查看,數據顯示如下:

 

然後去MongoDB查看,此條件查詢竟然有數據

但仔細查看確實失真了,兩者顯示的不一樣。例如:SerialNumber為XX41107960HEZE的Orderid,在SQL Server中是 32C8C3A1-3444-4440-9AE4-9B7631968080,但是在MongoDB中,就變成瞭如下模樣,點擊打開又是另外一個樣子。

JSON Viewer的界面顯示的OrderId數據就是二進位類型。

如上所示,MongoDB查詢顯示的數據有LUUID(),那我們在每個orderid數據上加上一個LUUID(),是不是就可以查找到了呢?

以SQL Server 的Orderid查看(失真前 32C8C3A1-3444-4440-9AE4-9B7631968080),沒有數據。

 

以MongoDB”失真”後的a1c3c832-4434-4044-9ae4-9b7631968080去查看。

直接查看沒有。

加上 LUUID()查看有了。

但驗證到這兒,還是不能根據SQL Server 中OrderID 去關聯查看 MongoDB中的數據啊!!!

 

 並且仔細查看 32C8C3A1-3444-4440-9AE4-9B7631968080(SQL Server中數據) 和 a1c3c832-4434-4044-9ae4-9b7631968080(MongoDB數據) 相似度很高。後面的幾個位元組9AE4-9B7631968080 都是一樣的。前面的幾個位元組,也都是在每個段內 以2位為單位重新排列組合。

這看著應該和數據的存儲 和類型有關,並且這個變化的只是GUID類型的”失真”了。

回頭再比較看看"失真"OrderId和沒失真的 SerialNumber在SQL Server 資料庫中是怎麼定義的。

OrderID在SQL Server數據中的數據類型是  [OrderId] [uniqueidentifier] NOT NULL,而 SerialNumber的類型如下: [SerialNumber] [varchar](50) NULL 

現在回頭去看看MongoDB存儲和SQL Server uniqueidentifier類型相關的知識。爭取從這方面找到突破口。

 

2. MongoDB存儲格式和SQL Server uniqueidentifier類型相關的知識

2.1 MongoDB 存儲格式

從內部講,MongoDB以二進位JSON格式存儲文檔數據或者叫BSON。BSON有相似的數據結構,但是專門為文檔存儲設計。當查詢MongoDB並返回結果時,這些數據就會轉換為易於閱讀的數據格式。MongoDB Shell使用JavaScript獲取JSON格式的文檔數據。所有的MongoDB驅動都執行三個主要的功能:首先,生成MongoDB對象ID。預設都存儲在所有文檔的_id欄位里。其次,驅動會把任意語言表示的文檔對象轉換為BSON或者從BSON轉換回來,BSON是MongoDB使用的二進位JSON格式。最後,使用TCP socket與資料庫連接通信,此時使用的是MongoDB自定義協議。

所有的文檔在發送給MongoDB之前都序列化為BSON格式,以後再從BSON反序列化。驅動庫會處理底層的數據類型轉換工作。絕大部分驅動都提供了從BSON序列化的簡單介面,當讀/寫文檔的時候會自動完成。二進位數據是一個任意位元組的字元串。它不能直接在shell中使用。如果要將非UTF-8字元保存到資料庫中,二進位數據是唯一的方式。

 2.2 SQL Server uniqueidentifier類型

uniqueidentifier 全局唯一標識符 (GUID)。

使用 NEWID 函數。

將字元串常量轉換為如下形式(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中每個 x 是 0-9 或 a-f 範圍內的一個十六進位的數字)。例如,6F9619FF-8B86-D011-B42D-00C04FC964FF 即為有效的 uniqueidentifier 值。 
 

3. 解決小竅門

通過以上知識瞭解,我們可能定位到數據“失真”應該和 BSON格式和驅動有關,那麼可以推測,這個工具(nosqlbooster)應該也有類似的驅動。

皇天不負苦心人,找找就找到了。

如下操作    管理設置圖標-->Display Legacy UUID in -->.NET Format

 

然後,執行點擊查看,結果變成瞭如下格式。

這個MongoDB結果中的數據和SQL Server 中的數據長的比較像了。

此時再次以SQL Server 資料庫中的一個OrderId 查看。

 

此時還是沒有數據

添加CSUUID()函數,再次查看有數據了

 

 到此,我們可以鬆口氣了,總算可以,拿到 SQL Server 中的某個Order Id,也可以去轉換後的MongoDB查看了。

 

 

 本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 內核很多重要子系統均通過proc文件的方式,將自身的一些統計信息輸出,方便最終用戶查看各子系統的運行狀態,這些統計信息被稱為metrics。 直接查看metrics並不能獲取到有用的信息,一般都是由特定的應用程式(htop/sar/iostat等)每隔一段時間讀取相關metrics,併進行相應計算, ...
  • 狂神聲明 : 文章均為自己的學習筆記 , 轉載一定註明出處 ; 編輯不易 , 防君子不防小人~共勉 ! linux學習:【第1篇】初識Linux及安裝 寫在前面 學習之初看了一段文章,很有感觸,所以也想把這些分享給大家,認真讀完,明確自己的方向 很多同學接觸Linux不多,對Linux平臺的開發更是 ...
  • 執行如下命令: 儘量按以下順序執行,否則可能會發生意向不到的問題(坑) 1.更新數據源 2.更新安裝包 3.安裝lxde桌面 4.安裝xrdp 5.開放伺服器3389埠 6.Windows遠程桌面連接,輸入root賬號密碼即可連接: 7.進入lxde安裝語言包 8.安裝完後重啟系統或者直接在命令行 ...
  • 一 Kubernetes概述 Kubernetes是一個全新的基於容器技術的分散式架構領先方案。Kubernetes(k8s)是Google開源的容器集群管理系統(谷歌內部:Borg)。在Docker技術的基礎上,為容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提高了大規模 ...
  • 使用hostname 進行修改。 創建用戶,修改密碼 ...
  • 一、背景 在平時開發過程當中需要針對 MySQL 資料庫進行監控,這裡我們可以使用 Grafana 和 Prometheus 來實現監控功能。Grafana 是一款功能強大的儀錶盤面板,支持多種數據源,可以自定義圖表進行監控。而 Prometheus 就是 Grafana 支持的數據源之一,Prom ...
  • 本文收錄在容器技術學習系列文章總目錄 1、製作鏡像 1.1 鏡像的生成途徑 基於容器製作 dockerfile,docker build 本篇主要詳細講解基於容器製作鏡像;基於dockerfile 製作鏡像在後一張文章Docker系列07—Dockerfile 詳解中詳細介紹; 1.2 基於容器製作 ...
  • 一、安裝步驟 1. 添加企業版附加包。 2. 安裝 PIP。 3. 更新 PIP。 4. 安裝 Docker Compose 二、可能遇到的問題 在執行 命令的時候可能會提示以下內容: 這個時候,你需要執行以下命令強制重新安裝 request。 安裝完成之後,Docker Compose 安裝成功。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...