web-dev-qa-db-ja.com

.csvファイルから最適な列幅を決定する

.CSVファイルをMySQLテーブルにインポートしたい。 CSVファイルに含まれる実際のデータに基づいて、使用する最適な列幅を決定したいと思います。これを実現するためのスクリプトやユーティリティはありますか?

5
hlosukwakha

guess適切な列の長さは可能な限り避けるのが最善です-CSVのソースを取得して、期待される形式をより詳細に指定できる場合(列XにはY文字以下が含まれます)、それを試してください。

最初は長い可変長タイプを選択することをお勧めします-これは、より制約のあるタイプよりも効率が悪い可能性がありますが、一部のフィールドが予想よりも大きくなった場合に、後のインポートでエラーが発生しないようにします(または、mysqlがサイレントに何かを切り捨てるため、さらに悪いことにサイレントにデータを失います)。 MSSQLでは、テキストフィールドはこの場合nvarchar(max)またはvarchar(max)になります。ただし、インデックスの一部である必要がある場合は、より制約する必要があります(インデックスなし)。 MSSQLでは900バイトを超えるデータになる可能性があります)。ソースからより多くのデータ形式の保証を取得できない限り、これが最も安全な方法ですが、もちろん少し推測を使用することもできます(たとえば、国民保険番号を含むフィールドは11文字を超えてはなりません。フィールドに誤った名前が付けられているか、その名前が示すもの以外のものを格納するためにオーバーロードされている可能性があるため、注意が必要です)。

推測する以外に選択肢がなく、大きな型を使用するのは非効率的だと感じる場合は、ゲスト化プロセスが、すべてのフィールドが最大長の可変テキスト型であるテーブルにファイルをインポートするのを支援してから、いくつかのrudementry分析を実行しますSELECT MAX(LEN(<field1>)), MAX(LEN(<field2>)) FROM <table>など、当て推量の基礎となる指標を取得します。文字列以外のフィールドの場合は、より複雑なパターンマッチングを使用して、予想される範囲を決定できます(つまり、フィールドXは常にISO形式のデータであり、フィールドYは-500から45,123までの数値で、小数点以下2桁までなど)。

「最適」に関して:短い固定長で十分な大きな可変長タイプを使用するのは非効率的かもしれませんが、効率と最適は必ずしも同じではありません。エラーが発生したり、データが失われたりした場合、効率的であることはほとんどメリットがありません。誤ってタイプを制限しすぎて設定すること。

2
David Spillett

PROCEDURE ANALYSE() あなたを助けることができます

次の手順に従って、少し複雑な方法を試すことができます。

  • file.csvを汎用テーブル「myTable」にロードします。ここで、すべてのフィールドはvarcharです。
  • select * from myTable PROCEDURE ANALYSE()を実行します

Optimal_fieldtypeの出力を分析し、提案された列タイプを評価するよりも

ここに出力のサンプルがあります

mysql select * from myTable PROCEDURE ANALYSE()\G
--------------------------- 1. row ---------------------------
             Field_name: myTable.fieldA
              Min_value: sample sample
              Max_value: omit
             Min_length: 4
             Max_length: 126
       Empties_or_zeros: 0
                  Nulls: 0
Avg_value_or_avg_length: 49.3771
                    Std: NULL
      Optimal_fieldtype: VARCHAR(126) NOT NULL
--------------------------- 2. row ---------------------------
             Field_name: myTable.fieldB
              Min_value: 1
              Max_value: 22043
             Min_length: 1
             Max_length: 5
       Empties_or_zeros: 7888
                  Nulls: 0
Avg_value_or_avg_length: 27.6984
                    Std: 168.4809
      Optimal_fieldtype: SMALLINT(5) UNSIGNED NOT NULL

出力の提案と要件に応じてテーブルを変更します。

0
Cristian Porta