web-dev-qa-db-ja.com

なぜまだvarcharデータ型があるのですか?

私のデータベースの多くには、varcharsとして定義されたフィールドがあります。私がアメリカに住んで働いているので、これはそれほど問題になりませんでした(存在する唯一の言語は「アメリカ人」です。ahem

約5年間データベースを操作した後、最終的にvarcharフィールドの制限された性質の問題に遭遇し、データをnvarcharとして格納するようにフィールドを変更する必要があることがわかりました。テーブルをもう一度更新し、varcharフィールドをnvarcharに変換する必要があった後、私はただ考えただけでした。私は長い間、テキストフィールドをすべてvarcharではなくnvarcharに定義するという精神的な決断をしてきました。これは、10年前の学校にいたときに教科書から学んだことです。

それは2011年で、昨年SQL Serverの新しいリリースがありました。代わりにnvarcharを使用できる/すべきなのに、なぜvarcharデータ型を引き続きサポートするのですか?

私はnvarcharがvarcharの「2倍の大きさ」であるとしばしば主張されることを知っています。そのため、ストレージスペースの使用はvarcarを維持するための1つの議論になる可能性があります。

ただし、今日のユーザーは、ストレージスペースを節約したい場合は、デフォルトのUTF-16ではなくUTF-8としてデータを格納するようにnvarcharを定義できます。これにより、主に望ましい場合は8ビットエンコーディングが可能になりますが、DBに挿入される2-8バイトのまれな文字が何も破損しないことが保証されます。

何か不足していますか?これが過去15〜20年間変化しなかった理由はありますか?

36
RLH
  1. varcharの作業は、いくつかの照合問題の影響を受ける多くの西ヨーロッパ言語(ノルウェー語、デンマーク語、ドイツ語、フランス語、オランダ語など)にも十分対応できます。

  2. これをSO varchar vs nvarchar performance で参照してください)nvarcharはパフォーマンスに深刻な影響を与えます

  3. これは、MDY対DMYの日付を処理する場合と比較すると、簡単です。

37
gbn

標準と互換性に対応する回答に加えて、パフォーマンスについても留意する必要があります。ディスクスペースは安価であると容易に認められていますが、DBA /開発者は、クエリのパフォーマンスがテーブルの行/ページサイズに直接関係する場合があるという事実を無視することがよくあります。 NVARCHARではなくVARCHARを使用すると(不要な場合)、文字フィールドの行サイズが事実上2倍になります。たとえば、50または50の長さのフィールドが5または10ある場合は、行ごとに500バイトが追加される可能性があることを意味します。幅の広いテーブルがある場合、これにより各行が複数のページにプッシュされ、パフォーマンスに悪影響を及ぼす可能性があります。

23
Derek Kromm

多くの組織には、シングルバイト文字を想定したアプリケーション、インターフェース、プラットフォーム、およびツールの大規模なインストールベースがあります。データベースが孤立して存在することはめったにありません-データベースはITエコシステムの一部です。 1バイト文字に依存する何千ものコンポーネントと何百万ものコード行がある場合、Unicodeに切り替えるのに必要な時間とお金を投資する十分な理由が必要になります。その規模での変更は、完了するまでに何年もかかる可能性があります。一部の地域では、Unicodeはまだ比較的新しく、まれであるか、完全にはサポートされていません。

VARCHARとNVARCHARはどちらもISO標準SQLの一部です。 SQL ServerでのVARCHARサポートの削除または廃止は、互換性と移植性の点で後退します。

17
nvogel

あるいは、今日のユーザーは、ストレージスペースを節約したい場合は、デフォルトのUTF-16ではなくUTF-8としてデータを格納するようにnvarcharを定義できます。

これがまさに、ほとんどのオープンソースデータベースがVARCHARで行うことです。

  • MySQLutf8およびucs2 "照合順序"を提供します。
  • SQLite は、UTF-8(デフォルト)とUTF-16のどちらかを選択できます。
  • PostgreSQL はUTF-8をサポートします(UTF-16はサポートしません)。

2つの別個の文字列タイプを用意する必要はありません。

マイクロソフトは、8ビット文字列がレガシーエンコーディング用であり、Unicode = UTF-16であるという見方で奇妙なものです。これはおそらく、Windows API自体がcharwchar_tをそのように扱っていることに関連しています。

16
dan04

私たちの中には、Unicode機能を必要としない最先端のハードウェアよりも軽量で小さなアプリケーションを構築している人もいます。後で変更する必要があるかもしれませんが、今のところは必要ありません。文字列がNVARCHARの下になければならないスペースの1/2を占めるのが好きです。

15
Jason