关键字: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. Python 字典和集合基于哈希表实现

    哈希表作为基础数据结构我不多说,有兴趣的可以百度,或者等我出一篇博客来细谈哈希表.我这里就简单讲讲:哈希表不过就是一个定长数组,元素找位置,遇到哈希冲突则利用 hash 算法解决找另一个位置,如果数组 ...

  2. Android--Tween补间动画

    前言 Android除了支持逐帧动画之外,也提供了对补间动画的支持,补间动画就是指开发人员只需要指定动画的开始.动画结束的"关键帧",而动画变化的"中间帧"由系 ...

  3. .NET代码树执行时间计时器

    有很多时候我们需要对代码不同段计算一个执行时间,并希望通过节点树的方式表达现每段代码的执行时长.在.Net下似乎找不到这样一个功能类,所以花了一些时间实现这样一个代码运行计时器.首先看一下简单的需求. ...

  4. 重排序、hb、ConcurrentHashMap弱一致性(jdk1.6)

    double pi = 3.14; //A double r = 1.0; //B double area = pi * r * r; //C 1.A -> B    //不满足happens- ...

  5. MySQL的可重复读级别能解决幻读吗

    引言 之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了.但是对于幻 ...

  6. .Net高并发解决思路(附源码)

    本文如有不对之处,欢迎各位拍砖扶正.另源码在文章最下面,大家下载过后先还原一下nuget包,需要改一下redis的配置,rabbitmq的配置以及Ef的连接字符串.另外使用的是CodeFirst,先u ...

  7. 微服务架构:Eureka参数配置项详解

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Eureka涉及到的参数配置项数量众多,它的很多功能都是通过参数配置来实现的,了解这些参数的含义有助于我们更好的应用Eureka的各种功能 ...

  8. leetcode — word-search

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...

  9. -1-0 Java 简介 java是什么 java简单介绍

    Java是一门纯粹的面向对象的高级的平台无关的编程语言 官网介绍: 了解 Java 技术  https://www.java.com/zh_CN/about/ 推荐词条: https://zh.wik ...

  10. java内置线程池ThreadPoolExecutor源码学习记录

    背景 公司业务性能优化,使用java自带的Executors.newFixedThreadPool()方法生成线程池.但是其内部定义的LinkedBlockingQueue容量是Integer.MAX ...