关键字: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查看了。

本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

SQL Server GUID 数据迁移至MongoDB后怎样查看?的更多相关文章

  1. 数据库迁移(SQL SERVER导入数据到MySql)

    地址:http://blog.csdn.net/jiaohougenyang/article/details/44937801 背景:项目最开始时使用的是SQL Server数据库,业务需求现要将数据 ...

  2. 《转》SQL Server 2008 数据维护实务

    SQL Server 2008 数据维护实务 http://blog.csdn.net/os005/article/details/7739553 http://www.cnblogs.com/xun ...

  3. 不同版本的SQL Server之间数据导出导入的方法及性能比较

    原文:不同版本的SQL Server之间数据导出导入的方法及性能比较 工作中有段时间常常涉及到不同版本的数据库间导出导入数据的问题,索性整理一下,并简单比较下性能,有所遗漏的方法也欢迎讨论.补充. 0 ...

  4. SQL Server 变更数据捕获(CDC)监控表数据

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现过程(Realization) 补充说明(Addon) 参考文献(References) ...

  5. 在SQL Server中将数据导出为XML和Json

        有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...

  6. c#直接调用ssis包实现Sql Server的数据导入功能

    调用ssis包实现Sql Server的数据导入功能网上已经有很多人讨论过,自己参考后也动手实现了一下,上一次笔者的项目中还用了一下这个功能.思前想后,决定还是贴一下增强记忆,高手请54. 1.直接调 ...

  7. SQL Server 将数据导出为XML和Json

    有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做,而SQ ...

  8. ORACLE和SQL SERVER的数据同步常用方法

    ORACLE和SQL SERVER的数据同步常用方法 1. 自己编程,或者第三方工具2. 在sqlserver中,使用linkedserver,访问oracle,然后编写job进行数据同步3. 在or ...

  9. sql server导出数据,远程连接失败,需要设置权限

    在sql  server management中右键当前连接——>方面 在 服务器配置中 将  RemoteAccessEnabled.RemoteDacEnabled设置为TRUE 安全性—— ...

随机推荐

  1. [Swift]LeetCode628. 三个数的最大乘积 | Maximum Product of Three Numbers

    Given an integer array, find three numbers whose product is maximum and output the maximum product. ...

  2. iOS学习——Quartz2D学习之DrawRect

    Quartz2D学习之DrawRect 本文以问答形式主要讲述Quartz2D的相关内容,参考内容是网上下载的学习视频资料. 1.什么是Quartz2D? 他是一个二维的绘图引擎,同时支持iOS和Ma ...

  3. python网络-TFTP客户端开发(25)

    一. TFTP协议介绍 TFTP(Trivial File Transfer Protocol,简单文件传输协议) 是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议 特点: ...

  4. python编程实战

    1.计算对称平方数 题目描述 打印所有不超过n(n<256)的,其平方具有对称性质的数,如11*11=121. 输入描述 无 输出描述 每行一个数,表示对称平方数 def f(n): flag ...

  5. Javascript基本类型回顾

    本文是学习和总结ECMAScript5.1规范形成的.是对规范中所提及的Javascript类型进行剖析后的个人观点的表达(如有Bug望各位道友指正).主要是各类型的实例方法,不包含任务构造函数的方法 ...

  6. Can't connect to X11 window server using ':1.0' as the value of the DISPLAY variable.

    安装oracle数据时需要用到图形界面安装,当我们用root用户登录后切换到oracle用户时运行./runInstaller提示报错: Can't connect to X11 window ser ...

  7. 『最小表示法 Necklace』

    最小表示法 这是一个简单的字符串算法,其解决的问题如下: 给定一个字符串\(S\),长度为\(n\),如果把它的最后一个字符不断放到最前面,会得到\(n\)个不同的字符串,那么我们称这\(n\)个字符 ...

  8. 《HelloGitHub月刊》第 10 期

    前言 这一年感谢大家的支持,小弟这里给大家拜年了! <HelloGitHub月刊>会一直做下去,欢迎大家加入进来提供更多的好的项目. 最后,祝愿大家:鸡年大吉- <HelloGitH ...

  9. Chapter 5 Blood Type——9

    He grimaced. 他扮了一个鬼脸. "Or better," I continued, the pent-up annoyance flowing freely now, ...

  10. Chapter 4 Invitations——13

    "Thank you," I said icily. “谢谢你”,我冰冷的说道. His eyes narrowed. 他眯着眼睛. "You're welcome,&q ...