列のデータが切り捨てられましたか?


90

Twilio呼び出しID(34文字列)を格納するためにMySql列のデータ型を変更した後、次のようにしてその列のデータを手動で変更しようとします。

update calls 
   set incoming_Cid='CA9321a83241035b4c3d3e7a4f7aa6970d' 
 where id='1';

ただし、列のデータ型が適切に変更されているため、表示しても意味がないエラーが発生しますか?

| Level ||| Code | Message | Warning | 1265 | Data truncated for column 'incoming_Cid' at row 1


2
変更後の正確なデータ型は何ですか?
Joachim Isaksson 2013

3
列にその長さのテキスト用の十分なスペースが指定されていることを確認しますか?
ジョンコンデ

1
ALTER TABLES calls MODIFY incoming_Cid STRING;私がしたことです。
zagstrug 2013

編集のために以前のコメントを削除しました:文字列をchar(1)ではなくchar(34)にするように指定していませんが、その方法がわかりません
Zagstrug 2013

STRINGMySQLタイプではありません。あなたのデータベースエンジンは何ですか?
RandomSeed 2013

回答:


83

あなたの問題は、現時点であなたのincoming_Cid列がCHAR(1)いつあるべきかとして定義されていることCHAR(34)です。

これを修正するには、このコマンドを発行して、列の長さを1から34に変更します。

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

これがSQLFiddleのデモです


13

ENUM( 'x'、 'y'、 'z')として定義されたテーブル列のために同じ問題が発生し、後で値 'a'をこの列に保存しようとしたため、言及されましたエラー。

テーブルの列定義を変更し、列挙型セットに値「a」を追加することで解決しました。


8

このステートメントを発行することにより:

ALTER TABLES call MODIFY incoming_Cid CHAR;

...長さパラメータを省略しました。したがって、クエリは次と同等でした。

ALTER TABLE calls MODIFY incoming_Cid CHAR(1);

1より大きいサイズのフィールドサイズを指定する必要があります。

ALTER TABLE calls MODIFY incoming_Cid CHAR(34);

5

ただし、列のデータ型が適切に変更されているため、表示しても意味がないエラーが発生しますか?

| Level | Code | Msg | Warn | 12 | Data truncated for column 'incoming_Cid' at row 1

次のようなことをしているときに、このメッセージが表示されることがよくあります。

REPLACE INTO table2 (SELECT * FROM table1);

この場合、次のエラーが発生しました。

SQL Exception: Data truncated for column 'level' at row 1

問題tinyintは、datetimeフィールドに格納しようとする結果となった列の不整合、またはその逆であることが判明しました。


1

私の場合、それは曜日を整数(0から6)として受け入れるENUMを持つテーブルでした。値0を整数として挿入すると、「列のデータが切り捨てられました...」というエラーメッセージが表示されたため、修正するには整数を文字列にキャストする必要がありました。したがって、代わりに:

$item->day = 0;

私がしなければなりませんでした;

$item->day = (string) 0;

そのようにゼロをキャストするのはばかげているように見えますが、私の場合はLaravelの工場にあり、次のように書く必要がありました。

$factory->define(App\Schedule::class, function (Faker $faker) {
    return [
        'day' => (string) $faker->numberBetween(0, 6),
        //
    ];
});

1

最初にcsvをmysqlにインポートしようとしたときに同じエラーが発生し、作成したmysqlテーブルにインポートするcsvフィールドの文字長がないことがわかりました。したがって、初めてcsvをインポートする場合

  1. 文字の長さを増やすことをお勧めします。
  2. すべてのフィールドにvarcharまたはのラベルを付けます。textブレンドしないでくださいint

その後、あなたは行ってもいいです。


0

列挙型である「SET」型のデータベースフィールドでも同じ問題が発生しました。

そのリストにない値を追加しようとしました。

追加しようとした値の10進値は256でしたが、列挙型リストには8つの値しかありませんでした。

1: 1   -> A
2: 2   -> B
3: 4   -> C
4: 8   -> D
5: 16  -> E
6: 32  -> F
7: 64  -> G
8: 128 -> H

そのため、フィールドに値を追加する必要がありました。

ここに画像の説明を入力してください

このドキュメントエントリを読むと、問題を理解するのに役立ちました。

MySQLはSET値を数値で格納し、格納された値の下位ビットは最初のセットメンバーに対応します。数値コンテキストでSET値を取得する場合、取得される値には、列値を構成するセットメンバーに対応するビットセットが含まれます。たとえば、次のようにSET列から数値を取得できます。

mysql> SELECT set_col+0 FROM tbl_name; If a number is stored into a

数値がSET列に格納されている場合、数値の2進表現で設定されたビットによって、列値の設定メンバーが決まります。SET( 'a'、 'b'、 'c'、 'd')として指定された列の場合、メンバーには次の10進値と2進値があります。

SET Member  Decimal Value   Binary Value
    'a'                1          0001
    'b'                2          0010
    'c'                4          0100
    'd'                8          1000

この列に値9、つまり2進数で1001を割り当てると、最初と4番目のSET値メンバー「a」と「d」が選択され、結果の値は「a、d」になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.