L'operatore = è una T-SQL non è tanto "uguale" come è "sono la stessa parola/frase, secondo le regole di confronto dell'espressione del contesto, "e LEN è" il numero di caratteri nella parola/frase. " Le regole di confronto non trattano gli spazi finali come parte della parola/frase che li precede (sebbene trattino gli spazi vuoti iniziali come parte della stringa che precedono).
Se è necessario distinguere "questo" da "questo", non utilizzare l'operatore "sono la stessa parola o frase" perché "questo" e "questo" sono la stessa parola.
Contribuire alla strada = funziona è l'idea che l'operatore di uguaglianza delle stringhe debba dipendere dai contenuti degli argomenti e dal contesto di confronto dell'espressione, ma non dovrebbe dipendere dai tipi degli argomenti, se essi sono entrambi i tipi di stringa.
Il concetto di linguaggio naturale di "questi sono la stessa parola" non è in genere abbastanza preciso da poter essere catturato da un operatore matematico come =, e non c'è alcun concetto di tipo di stringa in linguaggio naturale. Il contesto (cioè la collazione) è importante (ed esiste nel linguaggio naturale) e fa parte della storia, e ulteriori proprietà (alcune che sembrano stravaganti) fanno parte della definizione di = per renderlo ben definito nel mondo innaturale di dati.
Sul problema del tipo, non si desidera che le parole cambino quando vengono memorizzate in tipi di stringa diversi. Ad esempio, i tipi VARCHAR (10), CHAR (10) e CHAR (3) possono contenere tutte le rappresentazioni della parola "gatto" e? = 'gatto' dovrebbe permetterci di decidere se un valore di uno di questi tipi contiene la parola 'gatto' (con problemi di caso e accento determinati dalla collazione).
Risposta al commento di JohnFx:
Vedi Using char and varchar Data nella documentazione in linea. Citando da quella pagina, sottolineatura mia:
Ogni valore di dati char e varchar ha un confronto. Le regole di confronto definiscono gli attributi come gli schemi di bit utilizzati per rappresentare ciascun carattere, regole di confronto e la sensibilità al caso o all'accento.
Sono d'accordo che potrebbe essere più facile da trovare, ma è documentato.
Vale la pena notare anche che la semantica di SQL, dove = ha a che fare con i dati del mondo reale e il contesto del confronto (al contrario di qualcosa sui bit memorizzati sul computer) è stata parte di SQL per un a lungo. La premessa di RDBMS e SQL è la rappresentazione fedele dei dati del mondo reale, quindi il suo supporto per le collazioni molti anni prima che idee simili (come CultureInfo) entrassero nel regno delle lingue simili ad Algol. La premessa di quelle lingue (almeno fino a poco tempo fa) era la risoluzione dei problemi in ingegneria, non la gestione dei dati aziendali. (Recentemente, l'uso di linguaggi simili in applicazioni non ingegneristiche come la ricerca sta facendo qualche incursione, ma Java, C# e così via stanno ancora lottando con le loro radici non commerciali.)
A mio parere, non è giusto criticare SQL per essere diverso da "maggior parte dei linguaggi di programmazione". SQL è stato progettato per supportare un framework per la modellazione dei dati business che è molto diverso dall'ingegnerizzazione, quindi la lingua è diversa (e migliore per il suo obiettivo).
Heck, quando SQL è stato specificato per la prima volta, alcune lingue non avevano alcun tipo di stringa incorporato. E in alcune lingue ancora, l'operatore di uguaglianza tra stringhe non confronta affatto i dati di carattere, ma confronta i riferimenti! Non mi sorprenderebbe se tra un decennio o due, l'idea che == fosse dipendente dalla cultura diventasse la norma.
SQL 2005: selezionare len ('') restituisce 0 – Mayo
Fa lo stesso su Sql Server 2000. –
Questa è una domanda affascinante. Sembra che ritorni uguale, non importa quanti spazi hai messo in nessuna delle due stringhe, sia che corrispondano o meno. Dopo ulteriori sperimentazioni ho notato che sta effettivamente facendo un RTRIM su entrambi i lati dell'operatore di uguaglianza prima del confronto. Sembra che hai una risposta sulla funzione LEN, ma sono veramente interessati a una risposta più approfondita rispetto "VARCHAR e l'uguaglianza sono spinose in TSQ" per la parte uguaglianza della tua domanda. – JohnFx