guid mysql_关于MySQL:MySQL-如何搜索GUID

我正在使用第三方.NET库(Rhino Security),将其标识符存储为mysql数据库中binary(16)字段中的向导。 一切都可以从该应用程序完美地工作,但是当我尝试通过查询编辑器(对于MySQL为TOAD)手动运行查询时,没有行返回我知道存在的标识符。 例如,如果我运行以下查询,则不会得到任何结果:

SELECT Id, EntitySecurityKey, Type

FROM mydb.security_entityreferences

where EntitySecurityKey  =  '02a36462-49b7-406a-a3b6-d5accd6695e5'

在不使用过滤器的情况下运行同一查询将返回许多结果,其中一个在EntitySecurityKey字段中具有上述GUID。 还有另一种方法可以编写查询以搜索GUID /二进制字段吗?

谢谢!

编辑

我发现TOAD返回一个字符串而不是一个丑陋的Blob很有趣。 使用不同的编辑器返回结果(用于未过滤的查询),我得到了原始二进制数据。 我以为我的查询将使用二进制关键字运行,但以下两项均无效:

SELECT Id, EntitySecurityKey, Type

FROM mydb.security_entityreferences

where EntitySecurityKey  =  BINARY '02a36462-49b7-406a-a3b6-d5accd6695e5'

SELECT Id, EntitySecurityKey, Type

FROM mydb.security_entityreferences

where BINARY  EntitySecurityKey  =  '02a36462-49b7-406a-a3b6-d5accd6695e5'

我不熟悉Rhino Security,但据我所知它使用NHibernate来存储到数据库。

.net Guid内部使用1个Int32、2个Int16和8个字节来存储128位Guid值。

当NHibernate(3.2)将guid值存储到BINARY(16)列中或从中提取一个Guid值时,它分别使用.Net ToByteArray()方法和Guid(Byte [] ...)构造函数。这些方法基本上将字节顺序交换为Int32和Int16值。您可以考虑一下方法以查看确切的代码,但这是前4个字节的简单示例:

guidBytes[0] = (byte)this._int32member;

guidBytes[1] = (byte)(this._int32member >> 8),

guidBytes[2] = (byte)(this._int32member >> 16),

guidBytes[3] = (byte)(this._int32member >> 24);

这可能是造成您问题的原因。

例如,您的Guid以不同的方式存储在MySql中。

02a36462-49b7-406a-a3b6-d5accd6695e5-Guid.ToString()的指导

6264a302-b749-6a40-a3b6-d5accd6695e5-您使用MySql hex(Guid)在MySql中进行的引导

注意:hex(x)不添加破折号;为了进行比较,我手动添加了破折号。

请注意,前8个字节的顺序不同。

要测试这是否是您的问题,请运行以下查询:

SELECT Id, EntitySecurityKey, Type

FROM mydb.security_entityreferences

where EntitySecurityKey = UNHEX(REPLACE(6264a302-b749-6a40-a3b6-d5accd6695e5,'-',''));

如果是这样,我在自己的旅行中发现了其他一些事项:

Toad for MySql也使这一点变得复杂,因为它会在select语句输出中将Guid显示为.net等效项。如果将Guid包含在select的where子句中(至少根据我的经验),它将不会应用相同的转换。您将需要使用MySql存储的Guid。

您可能需要在执行数据库查询时手动转换Guid,或者可能需要引入自定义NHibernate类型以不同方式转换Guid。

您可以参考:

如何将.NET Guid读取为Java UUID

http://pastebin.com/M07wnK5K(我没有使用此代码,但发现它对参考很有用)

更新:

我只是在上面的pastebin链接上尝试了自定义NH类型。字节顺序不正确,至少对于我的环境而言。我会需要:

private static readonly int[] ByteOrder = new[] { 3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15 };

使.Net输出与从表输出中选择的十六进制(Guid列)匹配。

让我感到非常有趣的是,您将GUID存储在binary(16)字段中,重点放在16上。根据手册,binary字段的长度以字节为单位,并将截断它上面的所有内容(仅在严格模式)。您的GUID是否有可能被截断?使用示例GUID 02a36462-49b7-406a-a3b6-d5accd6695e5,尝试使用前16个字符查询数据库:

WHERE EntitySecurityKey = '02a36462-49b7-40'

根据对此问题的公认答案,字段应为char(16) binary来存储GUID,而不仅仅是binary(16)。但是,我无法在示例表中使用它。

对我有用的是使用char(36)以及binary(36)。尝试将您的字段长度更新为36,而不是16(为了安全起见,我会先在测试表上执行此操作)。

这是我的测试表:

CREATE TABLE test_security_keys (

test_key1 char(16) not null,

test_key2 char(16) binary not null,

test_key3 char(36) not null,

test_key4 binary(16) not null,

test_key5 binary(36) not null

);

然后,我运行了一个脚本来插入许多GUID(一行中的每一列都插入一个GUID)。您可以使用示例GUID对其进行测试:

INSERT INTO test_security_keys

VALUES ('02a36462-49b7-406a-a3b6-d5accd6695e5', '02a36462-49b7-406a-a3b6-d5accd6695e5', '02a36462-49b7-406a-a3b6-d5accd6695e5', '02a36462-49b7-406a-a3b6-d5accd6695e5', '02a36462-49b7-406a-a3b6-d5accd6695e5');

使用简单的SELECT * FROM test_security_keys将显示除大小为36的列以外的所有列。另外,无论是否binary,我都能通过常规的字符串比较成功查询列:

SELECT * FROM test_security_keys WHERE test_key3 = '02a36462-49b7-406a-a3b6-d5accd6695e5';

SELECT * FROM test_security_keys WHERE test_key5 = '02a36462-49b7-406a-a3b6-d5accd6695e5';

如果您已确认当前带有binary(16)的列没有被截断,那么我建议您在WHERE子句中使用CAST()。以下应该适用(与您的示例查询一起使用):

SELECT Id, EntitySecurityKey, Type

FROM mydb.security_entityreferences

WHERE

EntitySecurityKey = CAST('02a36462-49b7-406a-a3b6-d5accd6695e5' AS binary(16));

如果您CAST(.. AS binary(16))并且输入数据长于16个字节,则MySQL应该发出警告(应该是看不见的,不影响任何内容),指出它必须截断数据(如果得到了,请尝试SHOW WARNINGS;)。这是预料之中的,但这也意味着您不能使用binary(16)来存储GUID,而需要使用binary(36)或char(36)。

*我没有使用TOAD尝试任何一种方法,但是我同时使用了命令行MySQL和Navicat,并且两者的结果相同。

这不是问题,GUID只是一个128位的数字,即16个字节,可以存储在一个包含16个字节的二进制字段中-这就是binary(16)。 问题在于,与其他系统相比,.NET guid.ToByteArray()处理字节序的方式有所不同。 请阅读下面的@ user1748279答案以获取适当的信息,或者直接访问stackoverflow.com/questions/5745512/

当我评估其他人如何"搜索"主键为二进制类型(主要是指示GUID的binary(16))的记录并将其与我自己的记录进行比较时,遇到了这个问题。我必须承认我有点退缩,答案迅速脱离了用户希望根据二进制字段进行手动搜索的想法,而是专注于将列类型本身更改为字符,在这种情况下,这是对InnoDB存储的谋杀。

对于缺少结果的尝试解决方案是针对Id列而不是EntitySecurityKey列进行搜索。给定JP的原始查询,修改后的工作版本为:

SELECT Id, EntitySecurityKey, Type

FROM mydb.security_entityreferences

where Id  =  UNHEX(REPLACE('02a36462-49b7-406a-a3b6-d5accd6695e5', '-', ''));

同样,这假定Id字段是binary(16)类型。 (我无法确定哪一列:Id,EntitySecurityKey是二进制文件(16))。如果EntitySecurityKey是binary(16)列,则:

SELECT Id, EntitySecurityKey, Type

FROM mydb.security_entityreferences

where EntitySecurityKey  =  UNHEX(REPLACE('02a36462-49b7-406a-a3b6-d5accd6695e5', '-', ''));

如果未能产生期望的结果,则针对此问题(如何将.NET Guid读取为Java UUID),尝试进行相同的查询但GUID的前三个部分的字节序颠倒了,这将很有意义。

SELECT Id, EntitySecurityKey, Type

FROM mydb.security_entityreferences

where Id  =  UNHEX(REPLACE('6264a302-b749-6a40-a3b6-d5accd6695e5', '-', ''));

我能想到的唯一另一件事是EntitySecurityKey是基于ID的虚拟列,但是我在表设置上没有足够的信息来验证此语句。

干杯。

从您的修改中,我做了一点修改:

请试试

SELECT Id, EntitySecurityKey, Type

FROM mydb.security_entityreferences

WHERE EntitySecurityKey  = X'02a3646249b7406aa3b6d5accd6695e5'

由于每个字符串都有16个十六进制字节,因此可以使用...

您是否检查过表格中GUID数据的实际外观?由于它是主键,因此很有可能不会存储为GUID字符串。如果是这种情况,查询字符串值显然将不起作用。

可能是二进制格式?或者可能是一个字符串,但没有连字符?还是它已经以其他方式转换了?我不知道没有看到您的数据。但是无论如何,如果在查询时没有找到您知道的GUID,则无论它采用何种格式,显然都不会以您查询的格式存储它。

我要解决此问题的方法是在您知道存在的记录中搜索不同的值。甚至查询根本没有WHERE子句的前几条记录。

这将向您显示数据的实际外观。运气好的话,这足以让您确定其格式。

如果这样做没有帮助,则可能会从以下问题中得出一个线索:为什么二进制Guid与通常的表示形式有所不同

希望能有所帮助。

不知道如何设置数据库,但是我会尝试这两种变体:

SELECT Id, EntitySecurityKey, Type

FROM mydb.security_entityreferences

where EntitySecurityKey  =  x'02a3646249b7406aa3b6d5accd6695e5'

SELECT Id, EntitySecurityKey, Type

FROM mydb.security_entityreferences

where EntitySecurityKey  =  x'6264a302b7496a40b6a3d5accd6695e5'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 单例 生命周期_Rhythmk 一步一步学 JAVA (13) Spring-2 之Ben懒加载以及生命周期,单例...

1、定义Demo类:package com.rhythmk.spring;public class User {public void Init (){System.out.println("User 对象被 创建!");}// 计数器public int Count0;public void Say(){this.Count;System.out.println("User 被"this.Coun…

java 高级泛型_java泛型的高级应用

展开全部在上面的例子中,由于没有限制class GenericsFoo类型持有者T的范围,实际上这里32313133353236313431303231363533e59b9ee7ad9431333339666666的限定类型相当于Object,这和“Object泛型”实质是一样的。限制比如我们要限制T为集合接口类…

java窗体线条切换消失_java – 如何更改apache poi生成的图表不使用平滑线条并将空单元格显示为间隙?...

我使用的是POI 3.12-beta1,并且代码可以在图例中创建包含多个数据集和命名系列的折线图.但是,poi中折线图的默认设置会生成一条已在数据点上平滑的线.空值也被绘制为0,但我们希望这些线在第一列停止,其中有一个空单元格.一旦在xlsx文件中呈现并更改这些设置,我就可以进入图表属…

java正则表达式 问号_正则表达式问号的四种用法详解

正则表达式问号的四种用法详解原文符号因为?在正则表达式中有特殊的含义,所以如果想匹配?本身,则需要转义,\?有无量词问号可以表示重复前面内容的0次或一次,也就是要么不出现,要么出现一次。非贪婪匹配贪婪匹配在满…

java alert跳页面_JavaScript中通过提示框跳转页面的方法

通过提示框跳转页面具体代码如下所示:Documentwindow.onload function(){ //设置当页面加载时执行var btn document.getElementsByTagName("button")[] //获取btn元素btn.onclick function(){ //给button加上一个点击事件var answer confirm("是否…

java jsp if else if_jsp页面使用if else语句 | 学步园

jsp页面嵌入java语句使用即可,但是在使用if else语句时一定要注意使用是标点的使用,在语句中分号不能写,不符合jsp页面的语法规则,若多写了则会报错:如下:{name: priceRA, type: string}, {name: priceRB, type: string}, {name: priceRC, type: string},{name: priceRD, typ…

mysql 优化300例_mysql的limit优化实例

测试环境操作系统: debian linux服务器版本: Mysql 5.0.24Mysql数据库的Qcache缓存关闭数据库表testtable的参数:类型: MyISAM 大小: >80MB 记录规模: >50000 字段数: >25个字段id是主键 leibie字段上建有索引进行数据分段测试1>SQL不带where条件的测试1…

mysql+百万+中间表_MYSQL优化

MYSQL优化是一个非常大的课题,这篇文章主要介绍了跟MYSQL相关的4个方面,如果想深入研究可以查下相关资料。一、服务器级别优化二、操作系统级别优化三、MYSQL级别优化四、SQL级别优化一、服务器级别优化1.服务器选型SUN小型机、DELL730xd、HPDL380、IBM3…

java kafka 拉取_java获取kafka consumer lag

maven依赖org.apache.kafkakafka-clients0.10.1.0注意:kafka-clients版本需要0.10.1.0以上,因为调用了新增接口endOffsets;laglogsize-offsetlogsize通过consumer的endOffsets接口获得;offset通过consumer的committed接口获得;imp…

java开源图像处理ku_83 项开源视觉 SLAM 方案够你用了吗?

原标题:83 项开源视觉 SLAM 方案够你用了吗?公众号:3D视觉工坊主要关注:3D视觉算法、SLAM、vSLAM、计算机视觉、深度学习、自动驾驶、图像处理以及技术干货分享运营者和嘉宾介绍:运营者来自国内一线大厂的算法工程师&a…

java 方法的拆分_java – 字符串拆分和比较 – 最快的方法

>将输入读入byte []数组以将指针保持在代码的一侧.>逐字节读取,计算整数元素&#xff1a;int b inputBytes[p];int d b - 0;if (0 < d) {if (d < 9) {element element * 10 d;} else {// b :}} else {// b ,// add element to the hash; element 0;...}if (…

java sql异常_java.sql.SQLException: Io 异常: Got minus one from a

java.sql.SQLException: Io 异常: Got minus one from a read callat oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)at oracle.jdbc.driver.DatabaseError.thro…

java 拦截器ajax_(转)拦截器深入实践 - JAVA XML JAVASCRIPT AJAX CSS - BlogJava

Interceptor的定义我们来看一下Interceptor的接口的定义&#xff1a;Java代码 publicinterfaceInterceptorextendsSerializable {/*** Called to let an interceptor clean up any resources it has allocated.*/voiddestroy();/*** Called after an interceptor is created, b…

php学的是什么意思_为什么要学习PHP?到底什么是PHP?

为什么要学习PHP?到底什么是PHP?PHP可以做什么?相信这样的问题困扰着很多的人&#xff0c;在我没工作之前&#xff0c;都没有听说过PHP&#xff0c;自从工作后&#xff0c;慢慢接触到代码&#xff0c;慢慢知道什么是PHP。PHP是做网站一种语言&#xff0c;很多工程师都使用PH…

php 多数据库联合查询,php如何同时连接多个数据库_PHP教程

下面是一个函数能够保证连接多个数据库的下不同的表的函数&#xff0c;可以收藏一下&#xff0c;比较实用&#xff0c;测试过是有用的。function mysql_oper($oper,$db,$table,$where1,$limit10){$connmysql_connect(localhost,like,admin,true) or mysql_error();mysql_select…

java判断有没有修改,java字节码判断对象应用是否被修改

原创1 背景在学习并发的时候看到了ConcurrentLinkedQueue队列的源码&#xff0c;刚开始的时候是看网上的帖子&#xff0c;然后就到IDE里边看源码&#xff0c;发现offer()方法在1.7版的时候有过修改。楼主的问题不是整个方法&#xff0c;而是其中的一截代码“(t ! (t tail))”&…

php接口 含义,php晋级必备:一文读懂php接口特点和使用!

PHP接口与类是什么关系&#xff1f;前面提到了php中抽象类和抽象方法&#xff0c;今天给大家谈谈php中接口技术。在PHP中每个类只能继承一个父类&#xff0c;如果声明的新类继承了抽象类实现了以后&#xff0c;这个新类就不能有其它的父类了。但是在实际中需要继承多个类实现功…

php获取不重复的随机数字,php如何生成不重复的随机数字

【摘要】PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言&#xff0c;与C语言类似&#xff0c;是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。下面是php如何生成不重复的随机数字&#xff0c;让我们…

java 素数乘积,求助2424379123 = 两个素数的乘积,求这两个素数?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼import java.util.ArrayList;import java.util.Date;public class Test {static ArrayList list new ArrayList();/*** 初始化素数表* return*/public static ArrayList initArrayList() {list.add(2);list.add(3);list.add(5);li…

php header什么意思,php header是什么意思

header函数在PHP中是发送一些头部信息的, 我们可以直接使用它来做301跳转等&#xff0c;下面我来总结关于header函数用法与一些常用见问题解决方法。发送一个原始 HTTP 标头[Http Header]到客户端。标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的字串&…