si parla di
ANSI_PADDING e del suo setting di default..
Dopo la prima pagina di benvenuto (facoltativa, se si è precedentemente spuntato il flag "non mostrare.."), appare la seguente:
L'ho tagliata perchè quello che mi interessa è la prima opzione, ANSI PADDING, di default impostata a True.
Per curiosità ho controllato le opzioni di tutti i miei database, per capire se potessero esserci problemi nella migrazione, perchè mi sembrava che il setting fosse impostato diversamente.
Ebbene, ogni database aveva l'opzione a False:
Controllo poi sui Books Online se trovo qualcosa.. Trovo
questo link sulla documentazione.
Leggo quindi
Importante |
---|
In una versione futura di MicrosoftSQL Server ANSI_PADDING sarà sempre impostato su ON e qualsiasi applicazione che la imposta in modo esplicito su OFF restituirà un errore. Evitare di utilizzare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata. |
e ancora
Nota |
---|
È consigliabile impostare l'opzione ANSI_PADDING sempre su ON. |
e ancora
"L'impostazione predefinita di SET ANSI_PADDING è ON."
La maggior parte dei database che vedo (SQL Server 2008 10.0.4000) no.. non ho mai avuto l'esigenza di cambiare quell'impostazione e quindi il default è OFF in creazione..
Ho provato anche su altri SQL Server 2008, 2005 ed è sempre OFF(false).
Nonostante questo però, ogni volta che si esegue uno script in cui, ad esempio, creo tabelle e scrivo spazi alla fine del contenuto di un campo varchar, ottengo sempre il comportamento di ANSI_PADDING impostato ad ON. Anche quando si usano le funzioni del designer per le tabelle, ogni script generato "sotto" ed in generale ogni script di creazione/modifica delle tabelle stesse possiede in testa questo SET statement:
Il fatto fuorviante, almeno dal mio punto di vista, è che anche se l'opzione a database è OFF ogni nostra query gira in realtà con quello che management studio ha deciso come default di esecuzione. Se infatti aprite il menu tools -> Options.. alla voce Query Execution -> SQL Server -> ANSI, noterete che è spuntata la SET ANSI PADDING. Il che significa che ad ogni esecuzione Management studio ridefinisce in connessione l'impostazione di default del database, basandosi su quelle spunte (immagine sotto). Provate questo script togliendo la spunta e poi rimettendola (aprite per ogni caso una nuova query per applicare le impostazioni):
EXEC master.sys.sp_dboption @dbname = 'colibri_dev', @optname = 'ansi padding'
CREATE TABLE
#foo (val
varchar(20))
INSERT INTO
#foo VALUES ('CIAO ')
SELECT val + '*' FROM #foo;
DROP TABLE #foo;
go
la db option è OFF, ma il comportamento è da ANSI_PADDING = ON (gli spazi alla fine di un varchar non sono rimossi)
la db option è sempre OFF, e il comportamento è da ANSI_PADDING = OFF (spazi rimossi).
Questa cosa mi ha lasciato un po' perplesso, però, siccome il default di SSMS è ON, si può arrivare a dire di "non preoccuparsi". Forse perchè siamo abituati a non togliere gli spazi finali di un varchar (vale anche per gli zero finale di un varbinary). Ma il fatto che il comportamento sia implicito può ingannare chi deve applicare il comportamento OFF aspettandosi di utilizzare quello impostato nel database. Alla fine è sempre la connessione che decide e quindi tenete conto di quella finestra se volete cambiare il comportamento di default. Resta il fatto che la documentazione sconsiglia di impostarlo ad OFF.