可能性のある複製:
ここでvarcharよりもvarbinaryを使用する利点は何ですか?
この表をご覧ください。
http://www.mediawiki.org/wiki/Manual:Logging_table
ウィキペディアを見るとわかるように、varcharの代わりにvarbinaryを使用します。
| 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) | | | |
これらの情報はすべてテキストなので、なぜバイナリとして保存するのでしょうか。
すべてのテーブルでこれを行います。
Mediawikiは 2011年初頭にvarcharからvarbinaryに変更されました :
Varcharとの戦争。 varchar(N)およびvarchar(N)バイナリのすべての出現箇所をvarbinary(N)に変更しました。 varcharは、特定の構成、特にデフォルトのMySQL構成を持つMySQLデータベースで問題(「照合順序の無効な組み合わせ」エラー)を引き起こします。
MSSQLの場合:
大きな違いはnvarchar
とvarbinary
の間だけだと思います。
nvarchar
は、1バイトではなく各文字に2バイトを格納するためです。
varchar
は、MSDNのvarbinary
:と同じです。
ストレージサイズは、入力されたデータの実際の長さ+ 2バイトです。
ここでの違いは、varbinaryによるものです。入力されるデータの長さは0バイトになる可能性があります。
ここに小さな例があります:
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;