Data dipotong untuk kolom?


90

Setelah mengubah tipe data kolom MySql untuk menyimpan id panggilan Twilio (34 string karakter), saya mencoba mengubah data di kolom itu secara manual dengan:

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

Namun saya mendapatkan kesalahan yang tidak masuk akal karena tipe data kolom telah dimodifikasi dengan benar?

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


2
Apa tipe data yang tepat setelah modifikasi?
Joachim Isaksson

3
Apakah Anda yakin kolom tersebut telah menentukan cukup ruang untuk teks dengan panjang tersebut?
John Conde

1
ALTER TABLES calls MODIFY incoming_Cid STRING;adalah apa yang saya lakukan.
Zagstrug

Menghapus komentar sebelumnya karena EDIT: Saya belum menentukan bahwa string harus char (34) bukan char (1), tetapi tidak tahu bagaimana melakukannya
Zagstrug

STRINGbukan tipe MySQL. Apa mesin database Anda?
RandomSeed

Jawaban:


83

Masalah Anda adalah bahwa saat ini incoming_Cidkolom Anda ditetapkan sebagaimana CHAR(1)mestinya CHAR(34).

Untuk memperbaikinya, jalankan perintah ini untuk mengubah panjang kolom Anda dari 1 menjadi 34

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

Berikut adalah demo SQLFiddle


13

Saya memiliki masalah yang sama karena kolom tabel yang didefinisikan sebagai ENUM ('x', 'y', 'z') dan kemudian saya mencoba untuk menyimpan nilai 'a' ke dalam kolom ini, jadi saya mendapatkan yang disebutkan kesalahan.

Dipecahkan dengan mengubah definisi kolom tabel dan nilai tambah 'a' ke dalam kumpulan enum.


8

Dengan mengeluarkan pernyataan ini:

ALTER TABLES call MODIFY incoming_Cid CHAR;

... Anda menghilangkan parameter panjang. Oleh karena itu, kueri Anda setara dengan:

ALTER TABLE calls MODIFY incoming_Cid CHAR(1);

Anda harus menentukan ukuran bidang untuk ukuran lebih dari 1:

ALTER TABLE calls MODIFY incoming_Cid CHAR(34);

5

Namun saya mendapatkan kesalahan yang tidak masuk akal karena tipe data kolom telah dimodifikasi dengan benar?

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

Anda sering bisa mendapatkan pesan ini ketika Anda melakukan sesuatu seperti berikut:

REPLACE INTO table2 (SELECT * FROM table1);

Menghasilkan kasus kami dalam kesalahan berikut:

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

Masalahnya ternyata kolom misalignment yang mengakibatkan harus tinyintdicoba disimpan dalam suatu datetimefield atau sebaliknya.


1

Dalam kasus saya, itu adalah tabel dengan ENUM yang menerima hari dalam seminggu sebagai bilangan bulat (0 hingga 6). Saat memasukkan nilai 0 sebagai integer saya mendapat pesan error "Data dipotong untuk kolom ..." jadi untuk memperbaikinya saya harus memasukkan integer ke string. Jadi, alih-alih:

$item->day = 0;

Saya harus melakukan;

$item->day = (string) 0;

Kelihatannya konyol untuk membuang nol seperti itu, tetapi dalam kasus saya itu di pabrik Laravel, dan saya harus menulisnya seperti ini:

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

1

ketika saya pertama kali mencoba mengimpor csv ke mysql, saya mendapat kesalahan yang sama, dan kemudian saya menemukan tabel mysql yang saya buat tidak memiliki panjang karakter bidang csv yang mengimpor, jadi jika ini pertama kali mengimpor csv

  1. itu ide yang bagus untuk memberi lebih banyak panjang karakter.
  2. beri label semua bidang sebagai varcharatau text, jangan gabungkan intatau nilai lainnya.

maka Anda siap untuk pergi.


0

Saya memiliki masalah yang sama, dengan bidang database dengan tipe "SET" yang merupakan tipe enum.

Saya mencoba menambahkan nilai yang tidak ada dalam daftar itu.

Nilai yang saya coba tambahkan memiliki nilai desimal 256, tetapi daftar enum hanya memiliki 8 nilai.

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

Jadi saya hanya perlu menambahkan nilai tambahan ke lapangan.

masukkan deskripsi gambar di sini

Membaca entri dokumentasi ini membantu saya memahami masalahnya.

MySQL menyimpan nilai SET secara numerik, dengan bit orde rendah dari nilai yang disimpan sesuai dengan anggota set pertama. Jika Anda mengambil nilai SET dalam konteks numerik, nilai yang diambil memiliki bit yang disetel sesuai dengan anggota set yang membentuk nilai kolom. Misalnya, Anda dapat mengambil nilai numerik dari kolom SET seperti ini:

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

Jika sebuah nomor disimpan ke dalam kolom SET, bit yang ditetapkan dalam representasi biner dari nomor tersebut menentukan anggota yang ditetapkan dalam nilai kolom. Untuk kolom yang ditentukan sebagai SET ('a', 'b', 'c', 'd'), anggota memiliki nilai desimal dan biner berikut.

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

Jika Anda menetapkan nilai 9 ke kolom ini, yaitu 1001 dalam biner, maka nilai SET pertama dan keempat anggota 'a' dan 'd' dipilih dan nilai yang dihasilkan adalah 'a, d'.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.