Sütun için veri kesildi mi?


92

Twilio çağrı kimliklerini (34 karakter dizesi) saklamak için bir MySql sütununun veri türünü değiştirdikten sonra, o sütundaki verileri şu şekilde manuel olarak değiştirmeye çalışıyorum:

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

Bununla birlikte, sütunun veri türünün uygun şekilde değiştirildiğini görmenin mantıklı olmadığı bir hata alıyorum?

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


2
Değişiklikten sonra kesin veri türü nedir?
Joachim Isaksson

3
Sütunun, bu uzunluktaki metin için yeterince yer belirttiğinden emin misiniz?
John Conde

1
ALTER TABLES calls MODIFY incoming_Cid STRING;yaptığım şey.
Zagstrug

1
EDIT nedeniyle önceki yorum
silindi

STRINGbir MySQL türü değildir. Veritabanı motorunuz nedir?
RandomSeed

Yanıtlar:


86

Senin sorunun şu ki, incoming_Cidsütunun şu anda CHAR(1)olması gerektiği gibi tanımlanıyor CHAR(34).

Bunu düzeltmek için, sütunlarınızın uzunluğunu 1'den 34'e değiştirmek için bu komutu çalıştırın.

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

İşte SQLFiddle demosu


13

ENUM ('x', 'y', 'z') olarak tanımlanan bir tablo sütunu nedeniyle aynı sorunu yaşadım ve daha sonra bu sütuna 'a' değerini kaydetmeye çalıştım, hata.

Tablo sütun tanımını değiştirerek ve enum kümesine 'a' değerini ekleyerek çözüldü.


9

Bu beyanı yayınlayarak:

ALTER TABLES call MODIFY incoming_Cid CHAR;

... uzunluk parametresini atladınız. Bu nedenle sorgunuz şuna eşdeğerdi:

ALTER TABLE calls MODIFY incoming_Cid CHAR(1);

1'den büyük boyutlar için alan boyutunu belirtmelisiniz:

ALTER TABLE calls MODIFY incoming_Cid CHAR(34);

5

Bununla birlikte, sütunun veri türünün uygun şekilde değiştirildiğini görmenin mantıklı olmadığı bir hata alıyorum?

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

Aşağıdaki gibi bir şey yaptığınızda bu mesajı sıklıkla alabilirsiniz:

REPLACE INTO table2 (SELECT * FROM table1);

Bizim durumumuzda aşağıdaki hatayla sonuçlandı:

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

Sorun tinyint, bir datetimealanda depolanmaya çalışılmasıyla veya tam tersi ile sonuçlanan sütun yanlış hizalaması olarak ortaya çıktı .


1

Benim durumumda, haftanın günlerini tam sayı olarak (0'dan 6'ya kadar) kabul eden bir ENUM içeren bir tablodur. 0 değerini bir tamsayı olarak eklerken "Veri sütun için kesildi ..." hata mesajını aldım, bu yüzden bunu düzeltmek için tamsayıyı bir dizeye çevirmek zorunda kaldım. Yani bunun yerine:

$item->day = 0;

Yapmak zorundaydım;

$item->day = (string) 0;

Sıfırı böyle atmak aptalca görünüyor ama benim durumumda bir Laravel fabrikasındaydı ve bunu şöyle yazmak zorunda kaldım:

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

1

csv'yi mysql'e ilk aktarmayı denediğimde aynı hatayı aldım ve sonra oluşturduğum mysql tablosunun içe aktaran csv alanının karakter uzunluğuna sahip olmadığını anladım, bu yüzden ilk kez csv'yi içe aktarıyorsa

  1. daha fazla karakter uzunluğu vermek iyi bir fikirdir.
  2. tüm alanları varcharveya olarak etiketleyin text, karıştırmayın intveya diğer değerler.

o zaman gitmekte fayda var.


0

Bir enum türü olan "SET" türündeki bir veritabanı alanıyla aynı sorunu yaşadım.

O listede olmayan bir değeri eklemeye çalıştım.

Eklemeye çalıştığım değer 256 ondalık değerine sahipti, ancak enum listesinin yalnızca 8 değeri vardı.

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

Bu yüzden alana ek değer eklemem gerekiyordu.

görüntü açıklamasını buraya girin

Bu belge girişini okumak sorunu anlamama yardımcı oldu.

MySQL, SET değerlerini sayısal olarak depolar, ilk set üyesine karşılık gelen depolanmış değerin düşük sıralı biti. Sayısal bağlamda bir SET değeri alırsanız, alınan değerin sütun değerini oluşturan küme üyelerine karşılık gelen bit kümesi vardır. Örneğin, aşağıdaki gibi bir SET sütunundan sayısal değerler alabilirsiniz:

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

Bir sayı bir SET sütununda saklanırsa, sayının ikili gösteriminde ayarlanan bitler, sütun değerindeki küme üyelerini belirler. SET ('a', 'b', 'c', 'd') olarak belirtilen bir sütun için, üyeler aşağıdaki ondalık ve ikili değerlere sahiptir.

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

Bu sütuna 9 değerini atarsanız, yani ikili olarak 1001, böylece birinci ve dördüncü SET değeri üyeleri "a" ve "d" seçilir ve sonuçta elde edilen değer "a, d" olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.