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.pswp.cn/news/529691.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529691.shtml
英文地址,請注明出處:http://en.pswp.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 資料到瀏覽器前所送出的字串&…