ข้อมูลถูกตัดทอนสำหรับคอลัมน์?


92

หลังจากเปลี่ยนชนิดข้อมูลของคอลัมน์ MySql เพื่อจัดเก็บรหัสการโทร Twilio (34 สายอักขระ) ฉันพยายามเปลี่ยนข้อมูลในคอลัมน์นั้นด้วยตนเองด้วย:

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

3
คุณแน่ใจหรือไม่ว่าคอลัมน์ได้ระบุพื้นที่เพียงพอสำหรับข้อความที่มีความยาวนั้น
John Conde

1
ALTER TABLES calls MODIFY incoming_Cid STRING;คือสิ่งที่ฉันทำ
Zagstrug

ลบความคิดเห็นก่อนหน้านี้เนื่องจาก EDIT: ฉันไม่ได้ระบุว่าสตริงควรเป็น char (34) แทนที่จะเป็น char (1) แต่ไม่รู้จะทำอย่างไร
Zagstrug

STRINGไม่ใช่ประเภท MySQL เครื่องมือฐานข้อมูลของคุณคืออะไร?
RandomSeed

คำตอบ:


86

ปัญหาของคุณคือในขณะที่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' ลงใน enum set


9

โดยการออกคำสั่งนี้:

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

ในกรณีของฉันมันเป็นตารางที่มี ENUM ที่ยอมรับวันในสัปดาห์เป็นจำนวนเต็ม (0 ถึง 6) เมื่อใส่ค่า 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" ซึ่งเป็นประเภท enum

ฉันพยายามเพิ่มค่าที่ไม่มีอยู่ในรายการนั้น

ค่าที่ฉันพยายามเพิ่มมีค่าทศนิยม 256 แต่รายการ enum มีเพียง 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 บิตที่ตั้งค่าไว้ในการแทนค่าฐานสองของตัวเลขจะกำหนดสมาชิกชุดในค่าคอลัมน์ สำหรับคอลัมน์ที่ระบุเป็น SET ('a', 'b', 'c', 'd') สมาชิกจะมีค่าทศนิยมและฐานสองต่อไปนี้

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

หากคุณกำหนดค่าเป็น 9 ให้กับคอลัมน์นี้นั่นคือ 1001 เป็นไบนารีดังนั้นสมาชิกค่า SET ตัวแรกและตัวที่สี่จะถูกเลือก "a" และ "d" และค่าผลลัพธ์คือ "a, d"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.