86

架空の病院記録用のデータベースを作成し、そこにデータを入力する MySQL スクリプトを作成しました。テーブルの 1 つである Department には、varchar(200) 型として宣言されている Description という名前の列があります。説明の INSERT コマンドを実行すると、次のエラーが表示されます。

エラー 1406: 行 1 の列 '説明' のデータが長すぎます。

挿入する文字列はすべて 150 文字未満です。

宣言は次のとおりです。

CREATE TABLE Department(
    ...
    Description varchar(200)
    ...);

そして、挿入コマンドは次のとおりです。

INSERT INTO Department VALUES
(..., 'There is some text here',...), (..., 'There is some more text over here',...);

どう見ても、これは機能するはずです。誰か洞察力がありますか?

4

14 に答える 14

55

古いデータベースを新しいバージョンに移行するときに、同様の問題が発生しました。

STRICT を使用しないように MySQL モードを切り替えます。

SET @@global.sql_mode= 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

エラー コード: 1406。列のデータが長すぎます - MySQL

于 2016-01-20T19:05:11.463 に答える
18

列の数や個々の列の長さに関係なく、mysql テーブルの 1 つの行に格納できるデータの量には厳しい制限があります。

公式ドキュメントに記載されているように

すべての列の合計の長さがこのサイズを超えることはできないため、行の最大サイズによって列の数 (および場合によってはサイズ) が制限されます。たとえば、utf8 文字は 1 文字あたり最大 3 バイトを必要とするため、CHAR(255) CHARACTER SET utf8 列の場合、サーバーは値ごとに 255 × 3 = 765 バイトを割り当てる必要があります。したがって、テーブルには 65,535 / 765 = 85 を超える列を含めることはできません。

可変長列のストレージには、行サイズに対して評価される長さのバイトが含まれます。たとえば、VARCHAR(255) CHARACTER SET utf8 列は、値の長さを格納するのに 2 バイトかかるため、各値は最大 767 バイトになります。

ここでINNODBテーブルの制限を見つけることができます

于 2013-09-19T14:33:21.440 に答える
9

よくあることですが、それは私の愚かな間違いでした。これをテストしていた方法では、データ型を varchar(50) から varchar(200) に変更した後に Department テーブルを再構築していませんでした。挿入コマンドを再実行しましたが、列は varchar(50) のままです。

于 2013-09-19T18:14:03.167 に答える
2

Hibernate を使用すると、独自の UserType を作成できます。それが私がこの問題のためにしたことです。これと同じくらい簡単なもの:

    public class BytesType implements org.hibernate.usertype.UserType {

         private final int[] SQL_TYPES = new int[] { java.sql.Types.VARBINARY };
     //...
    }

もちろん、独自の UserType を拡張して実装することは他にもありますが、他のメソッドを探している人のためにそれを公開したかっただけです。

于 2014-08-18T15:07:33.903 に答える
2

非常に古い質問ですが、上記で提案したすべてを試しましたが、まだ解決できませんでした。

結局のところ、同様の構造を持つ履歴テーブルにレコードを挿入することで変更を追跡するメインテーブルの挿入/更新トリガーがありました。メイン テーブルの列のサイズを大きくしましたが、履歴テーブルの列のサイズを変更するのを忘れたため、問題が発生しました。

他のテーブルでも同様の変更を行ったところ、エラーはなくなりました。

于 2019-06-06T08:43:54.627 に答える
1

フィールドが 200 文字のテーブルを作成しようとしましたが、最初の 160 文字の行を 2 つ追加しましたが、問題ありません。行が 200 文字未満でよろしいですか?

SqlFiddle を表示

于 2013-09-19T14:35:24.230 に答える
1

ハッシュ化されたパスワードをテーブルに格納する際にも同様の問題がありました。列の最大長を変更しても解決しませんでした。すべてがシンプルであることが判明しました。以前に作成したテーブルをデータベースから削除し、許容される長さの新しい値でコードをテストする必要がありました。

于 2021-03-29T12:12:00.203 に答える