2012-11-15 10 views
22

Eventuali duplicati:
What is the advantage of using varbinary over varchar here?perché varbinary invece di varchar

Si prega di dare un'occhiata a questa tabella:

http://www.mediawiki.org/wiki/Manual:Logging_table

Come si può vedere l'uso wikipedia varbinary invece di varchar:

| log_type  | **varbinary**(32)  | NO | MUL |    | 
| log_action | **varbinary**(32)  | NO |  |    | 
| log_timestamp | **binary**(14)   | NO | MUL | 19700101000000 | 
| log_user  | int(10) unsigned  | NO | MUL | 0    | 
| log_user_text | **varbinary**(255)  |  |  |    | 

Tutte queste informazioni sono di testo, quindi perché li salvano come binari?

Lo fanno per tutti i tavoli.

+2

[Qui] (http: // stackoverflow.it/questions/5978484/what-is-the-advantage-of-using-varbinary-over-varchar-qui) parla di varbinary usando meno spazio di varchar. – threenplusone

+0

@threenplusone - Questo è nel contesto di un particolare puzzle. Piuttosto che convertire la stringa '1.2.3' in' '100000000011000000000210000000003'' inserendo ciascun componente nella lunghezza massima di un int utilizza una rappresentazione binaria più compatta '0x020000000102000000020200000003' –

+0

@MartinSmith hai ragione, mi dispiace. Questo è quello che ottengo per non aver letto a fondo. – threenplusone

risposta

12

Mediawiki modificata da varchar a varbinary in early 2011:

Guerra al varchar. Modificate tutte le occorrenze di varchar (N) e varchar (N) binario in varbinary (N). varchars causa problemi ("Errore di mix non valido degli errori di confronto ") nei database MySQL con determinate configurazioni, in particolare , in particolare la configurazione predefinita di MySQL.

+0

Credo che la raccolta sia un motivo per questo :) + 1 perché è una buona risposta per il motivo per cui Mediawiki ha apportato la modifica –

+11

Sembra che abbiano risolto il problema dalla parte sbagliata. Hanno messo a tacere il sintomo invece di risolvere il problema delle regole di confronto. – usr

+0

grazie per estintore – user1411084

5

In MSSQL:

penso che la grande differenza è solo tra nvarchar e varbinary.

Perché nvarchar memorizza 2 byte per ogni carattere anziché 1 byte.

varchar fa lo stesso come varbinary: da MSDN:

La dimensione di archiviazione è la lunghezza effettiva dei dati inseriti + 2 byte" sia

La differenza qui è da varbinary . il dato immesso può essere 0 byte in lunghezza.

Ecco un piccolo exa mple:

CREATE TABLE Test (textData varchar(255), binaryData varbinary(255)) 

INSERT INTO Test 
VALUES('This is an example.', CONVERT(varbinary(255),'This is an example.',0)) 
INSERT INTO Test 
VALUES('ÜŰÚÁÉÍä', CONVERT(varbinary(255),'ÜŰÚÁÉÍä',0)) 

Che cosa si può usare qui è la funzione DATALENGTH:

SELECT datalength(TextData), datalength(binaryData) FROM test 

Il risultato è 19 - non ci 7

Quindi, in dimensioni che sono gli stessi, MA - 19 e 7 è un'altra differenza. Se si controllano le specifiche della colonna, è possibile vedere che il varbinary (ovviamente) non ha collazione e set di caratteri, quindi potrebbe aiutare a usare facilmente i valori di diversi tipi di codifica e set di caratteri.

SELECT 
    * 
FROM 
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_NAME = 'Test' 
ORDER BY 
    ORDINAL_POSITION ASC; 
Problemi correlati