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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...