2015-08-07 19 views
5

Ho una tabella denominata Student, contiene una colonna StudentId come GUID, quindi ho utilizzato il tipo di dati Uniqueidentifier per quello.Guida con caratteri aggiuntivi problema

Se voglio ottenere record particolare, ottengo il risultato dalla query di seguito:

SELECT * FROM Student WHERE StudentId = '919C3BF9-B081-458C-897D-C0B3FF56AF73' 

restituisce il risultato atteso. Ma nel caso in cui aggiungo per errore anche caratteri extra alla fine, restituisce lo stesso risultato. Come la domanda sotto:

SELECT * FROM Student WHERE StudentId = '919C3BF9-B081-458C-897D-C0B3FF56AF73xyz' 

Se mi passa i caratteri extra alla fine del GUID, motivo per cui non è considerare come non valido GUID? e restituire lo stesso risultato?

+0

piuttosto stringa user confrontare in SQL –

risposta

2

GUID è 16 byte, quindi dal dato 919C3BF9-B081-458C-897D-C0B3FF56AF73

91 è 1 ° byte
9C è 2 ° byte
3B è 3 ° byte
F9 è 4 byte
..
..
..
..
56 è 14 byte
AF è 15 byte
73 è 16 byte

Analisi di 919C3BF9-B081-458C-897D-C0B3FF56AF73xyz completa prima della xyz.

Quindi i caratteri immessi dopo il 16 ° byte, non verranno presi in considerazione.

Ma se si aggiungono caratteri aggiuntivi nella parte anteriore, non sarà considerato valido GUID.

Inoltre, quando si esegue una query con GUID, utilizzare il codice tra {}.

SELECT * FROM Student 
WHERE StudentId = '{919C3BF9-B081-458C-897D-C0B3FF56AF73}' 
+1

Per aggiungere a questa risposta, un tipo di dati 'uniqueidentifier' ha un più alto tipo di dati la precedenza rispetto varchar in modo che il varchar letterale è implicitamente convertito in uniqueidentifier.L'analisi è apparentemente più lassa senza il recinto di parentesi graffa, troncando i caratteri estranei nel letterale. –

+1

I caratteri extra all'interno delle parentesi graffe provocano un errore, tuttavia i caratteri extra all'esterno di '{}' vengono ignorati e troncati. 'SELECT CONVERT (uniqueidentifier, '{919C3BF9-B081-458C-897D-C0B3FF56AF73} EXTRA') SELECT CONVERT (uniqueidentifier, '{919C3BF9-B081-458C-897D-C0B3FF56AF73EXTRA}')' – ughai

+1

Grazie per aver introdotto il '{} 'quando si usa con' guid'! –

3

Come indicato dal documentation:

Il seguente esempio dimostra il troncamento dei dati quando il valore è troppo lungo per il tipo di dati di essere convertito in. Poiché il tipo uniqueidentifier è limitato a 36 caratteri, i caratteri che superano tale lunghezza vengono troncati.

DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong'; 
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue; 

Ecco il set di risultati.

String          TruncatedValue 
-------------------------------------------- ------------------------------------ 
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong 0E984725-C51C-4BF4-9960-E1C80E27ABA0 

(1 row(s) affected) 
+0

msdn ha anche un esempio simile che specifica lo stesso – ughai

+1

forse aggiungere questo esempio per dimostrare: 'SELEZIONA CONVERT (UNIQUEIDENTIFIER, '919C3BF9-B081-458C-897D-C0B3FF56AF73-This-is-extra')' - produce: '919C3BF9-B081 -458C-897D-C0B3FF56AF73' – Tanner