Dữ liệu bị cắt ngắn cho cột?


90

Sau khi thay đổi kiểu dữ liệu của cột MySql để lưu trữ id cuộc gọi Twilio (34 chuỗi ký tự), tôi cố gắng thay đổi thủ công dữ liệu trong cột đó bằng:

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

Tuy nhiên, tôi gặp lỗi không có ý nghĩa gì khi xem kiểu dữ liệu của cột đã được sửa đổi đúng cách?

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


2
Loại dữ liệu chính xác sau khi sửa đổi là gì?
Joachim Isaksson

3
Bạn có chắc rằng cột đó đã chỉ định đủ chỗ cho văn bản có độ dài đó không?
John Conde

1
ALTER TABLES calls MODIFY incoming_Cid STRING;là những gì tôi đã làm.
Zagstrug

Xóa bình luận trước do EDIT: Tôi đã không quy định rằng chuỗi nên char (34) thay vì char (1), nhưng không biết làm thế nào để quá
Zagstrug

STRINGkhông phải là một loại MySQL. Công cụ cơ sở dữ liệu của bạn là gì?
RandomSeed

Câu trả lời:


83

Vấn đề của bạn là tại thời điểm incoming_Cidcột của bạn được xác định CHAR(1)khi nào nó nên được CHAR(34).

Để khắc phục điều này, chỉ cần phát hành lệnh này để thay đổi độ dài các cột của bạn từ 1 thành 34

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

Đây là bản demo SQLFiddle


13

Tôi đã gặp vấn đề tương tự vì một cột trong bảng được định nghĩa là ENUM ('x', 'y', 'z') và sau đó tôi đã cố gắng lưu giá trị 'a' vào cột này, do đó tôi nhận được đề cập lỗi.

Giải quyết bằng cách thay đổi định nghĩa cột bảng và giá trị thêm vào 'a' vào tập hợp enum.


8

Bằng cách đưa ra tuyên bố này:

ALTER TABLES call MODIFY incoming_Cid CHAR;

... bạn đã bỏ qua tham số độ dài. Do đó, truy vấn của bạn tương đương với:

ALTER TABLE calls MODIFY incoming_Cid CHAR(1);

Bạn phải chỉ định kích thước trường cho các kích thước lớn hơn 1:

ALTER TABLE calls MODIFY incoming_Cid CHAR(34);

5

Tuy nhiên, tôi gặp lỗi không có ý nghĩa gì khi xem kiểu dữ liệu của cột đã được sửa đổi đúng cách?

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

Bạn thường có thể nhận được thông báo này khi bạn đang làm điều gì đó như sau:

REPLACE INTO table2 (SELECT * FROM table1);

Kết quả trong trường hợp của chúng tôi là lỗi sau:

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

Vấn đề hóa ra là sự lệch cột dẫn đến việc tinyintcố gắng lưu trữ trong một datetimetrường hoặc ngược lại.


1

Trong trường hợp của tôi, đó là một bảng có ENUM chấp nhận các ngày trong tuần là số nguyên (0 đến 6). Khi chèn giá trị 0 dưới dạng số nguyên, tôi nhận được thông báo lỗi "Dữ liệu bị cắt ngắn cho cột ..." vì vậy để khắc phục, tôi phải truyền số nguyên thành một chuỗi. Vì vậy, thay vì:

$item->day = 0;

Tôi phải làm;

$item->day = (string) 0;

Có vẻ ngớ ngẩn khi sử dụng số 0 như vậy nhưng trong trường hợp của tôi, đó là trong một nhà máy Laravel, và tôi phải viết nó như thế này:

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

1

khi lần đầu tiên tôi cố gắng nhập csv vào mysql, tôi gặp lỗi tương tự và sau đó tôi phát hiện ra bảng mysql mà tôi đã tạo không có độ dài ký tự của trường csv nhập, vì vậy nếu đây là lần đầu tiên nhập csv

  1. đó là một ý tưởng hay để cung cấp thêm độ dài ký tự.
  2. gắn nhãn tất cả các trường là varcharhoặc text, không trộn lẫn inthoặc các giá trị khác.

sau đó bạn tốt để đi.


0

Tôi gặp vấn đề tương tự, với trường cơ sở dữ liệu có kiểu "SET" là kiểu enum.

Tôi đã cố gắng thêm một giá trị không có trong danh sách đó.

Giá trị tôi đã cố gắng thêm có giá trị thập phân 256, nhưng danh sách enum chỉ có 8 giá trị.

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

Vì vậy, tôi chỉ cần thêm giá trị bổ sung vào trường.

nhập mô tả hình ảnh ở đây

Đọc mục tài liệu này đã giúp tôi hiểu vấn đề.

MySQL lưu trữ các giá trị SET bằng số, với bit bậc thấp của giá trị được lưu trữ tương ứng với thành viên được đặt đầu tiên. Nếu bạn truy xuất giá trị SET trong ngữ cảnh số, giá trị được truy xuất có các bit được đặt tương ứng với các thành viên đã đặt tạo nên giá trị cột. Ví dụ: bạn có thể truy xuất các giá trị số từ một cột SET như sau:

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

Nếu một số được lưu trữ trong một cột SET, các bit được đặt trong biểu diễn nhị phân của số đó sẽ xác định các thành viên đã đặt trong giá trị cột. Đối với một cột được chỉ định là SET ('a', 'b', 'c', 'd'), các phần tử có các giá trị thập phân và nhị phân sau.

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

Nếu bạn gán giá trị 9 cho cột này, tức là 1001 trong hệ nhị phân, vì vậy các thành viên giá trị SET đầu tiên và thứ tư 'a' và 'd' được chọn và giá trị kết quả là 'a, d'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.