2012-11-15 68 views
22

可能重複:
What is the advantage of using varbinary over varchar here?爲什麼VARBINARY而非VARCHAR

請看一看這個表:

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

正如你可以看到維基百科使用VARBINARY而不是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)  |  |  |    | 

所有這些信息都是文本,所以他們爲什麼把它們保存爲二進制文件?

他們對所有表格都這樣做。

+2

[Here](http:// stackoverflow。com/questions/5978484/what-is-the-advantage-varbinary-over-varchar-here)談論varbinary時使用較少的空間,然後varchar。 – threenplusone

+0

@threenplusone - 這是在一個特定的難題。不是通過將每個組件填充到int的最大長度而將字符串「1.2.3」轉換爲「100000000011000000000210000000003」,而是使用更緊湊的二進制表示「0x020000000102000000020200000003」 –

+0

@MartinSmith你是對的,對此抱歉。這就是我沒有徹底閱讀的結果。 – threenplusone

回答

12

的mediawiki從varchar改變了early 2011到VARBINARY:

戰爭VARCHAR。將所有出現的varchar(N)和varchar(N) 二元數據更改爲varbinary(N)。 varchars會導致MySQL數據庫中的某些配置出現問題(「無效混合 排序規則」錯誤),大多數 特別是默認的MySQL配置。

+0

我認爲排序是這個:) + 1的原因,因爲它是一個很好的答案,爲什麼Mediawiki做了改變 –

+11

它看起來像他們解決了錯誤的一面的問題。他們沉默了症狀,而不是修復潛在的整理問題。 – usr

+0

非常感謝您的支持 – user1411084

5

在MSSQL:

我覺得最大的區別是隻之間nvarcharvarbinary

因爲nvarchar爲每個字符存儲2個字節而不是1個字節。

varchar確實相同varbinary:從MSDN:

存儲大小爲輸入+ 2個字節」 兩者的數據的實際長度

這裏的區別是由VARBINARY 。被輸入的數據可以是0 字節長度。

這裏是一個小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)) 

什麼,你可以在這裏使用的是DATALENGTH功能:

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

結果是19 - 19和7 - 7

所以在大小,他們都是一樣的,但有是另一個區別。如果查看列規範,則可以看到,varbinary(當然)沒有整理和字符集,因此它可以幫助輕鬆使用來自不同類型的編碼和字符集的值。

SELECT 
    * 
FROM 
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_NAME = 'Test' 
ORDER BY 
    ORDINAL_POSITION ASC; 
相關問題