web-dev-qa-db-ja.com

なぜvarcharではなくvarbinaryなのか

可能性のある複製:
ここで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)      |      |     |                |

これらの情報はすべてテキストなので、なぜバイナリとして保存するのでしょうか。

すべてのテーブルでこれを行います。

26
user1411084

Mediawikiは 2011年初頭にvarcharからvarbinaryに変更されました

Varcharとの戦争。 varchar(N)およびvarchar(N)バイナリのすべての出現箇所をvarbinary(N)に変更しました。 varcharは、特定の構成、特にデフォルトのMySQL構成を持つMySQLデータベースで問題(「照合順序の無効な組み合わせ」エラー)を引き起こします。

16
Sjoerd

MSSQLの場合:

大きな違いはnvarcharvarbinaryの間だけだと思います。

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; 
6
András Ottó