Gegevens afgekapt voor kolom?

Na het wijzigen van het gegevenstype van een MySql-kolom om Twilio-oproep-id’s (34 char strings), probeer ik de gegevens in die kolom handmatig te wijzigen met:

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

Ik krijg echter een foutmelding die niet logisch is aangezien het gegevenstype van de kolom correct is gewijzigd?

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


Antwoord 1, autoriteit 100%

Uw probleem is dat op dit moment uw incoming_Cidkolom gedefinieerd is als CHAR(1)terwijl het CHAR(34)zou moeten zijn.

Om dit op te lossen, geeft u deze opdracht om de lengte van uw kolommen te wijzigen van 1 in 34

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

Hier is de SQLFiddle-demo


Antwoord 2, autoriteit 16%

Ik had hetzelfde probleem vanwege een tabelkolom die was gedefinieerd als ENUM(‘x’,’y’,’z’) en later probeerde ik de waarde ‘a’ in deze kolom op te slaan, dus ik kreeg de genoemde fout.

Opgelost door wijziging van de tabelkolomdefinitie en toegevoegde waarde ‘a’ in de opsommingsset.


Antwoord 3, autoriteit 10%

Door deze verklaring af te geven:

ALTER TABLES call MODIFY incoming_Cid CHAR;

… je hebt de lengteparameter weggelaten. Uw zoekopdracht was daarom gelijk aan:

ALTER TABLE calls MODIFY incoming_Cid CHAR(1);

U moet de veldgrootte opgeven voor formaten groter dan 1:

ALTER TABLE calls MODIFY incoming_Cid CHAR(34);

Antwoord 4, autoriteit 5%

Ik krijg echter een foutmelding die niet logisch is aangezien het gegevenstype van de kolom correct is gewijzigd?

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

U kunt deze melding vaak krijgen als u iets als het volgende doet:

REPLACE INTO table2 (SELECT * FROM table1);

Resulteerde in ons geval in de volgende fout:

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

Het probleem bleek een verkeerde uitlijning van de kolom te zijn die resulteerde in een tinyintdie probeerde te worden opgeslagen in een datetime-veld of omgekeerd.


Antwoord 5

In mijn geval was het een tabel met een ENUM die de dagen van de week accepteert als gehele getallen (0 tot 6). Bij het invoegen van de waarde 0 als een geheel getal kreeg ik de foutmelding “Gegevens afgekapt voor kolom …” dus om het te repareren moest ik het gehele getal naar een string casten. Dus in plaats van:

$item->day = 0;

Ik moest doen;

$item->day = (string) 0;

Het ziet er gek uit om de nul zo te casten, maar in mijn geval was het in een Laravel-fabriek, en ik moest het zo schrijven:

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

Antwoord 6

toen ik voor het eerst probeerde csv in mysql te importeren, kreeg ik dezelfde fout en toen kwam ik erachter dat de mysql-tabel die ik heb gemaakt niet de tekenlengte heeft van het importerende csv-veld,
dus als het de eerste keer is dat je csv importeert

  1. het is een goed idee om meer karakterlengte te geven.
  2. label alle velden als varcharof text, meng geen intof andere waarden.

dan ben je klaar om te gaan.


Antwoord 7

Ik had hetzelfde probleem met een databaseveld met het type “SET”, wat een enum-type is.

Ik heb geprobeerd een waarde toe te voegen die niet in die lijst stond.

De waarde die ik probeerde toe te voegen had de decimale waarde 256, maar de opsommingslijst had slechts 8 waarden.

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

Dus ik moest gewoon de toegevoegde waarde aan het veld toevoegen.

Het lezen van deze documentatieheeft me geholpen de probleem.

MySQL slaat SET-waarden numeriek op, met het lage-orde bit van de
opgeslagen waarde die overeenkomt met het eerste ingestelde lid. Als u een
SET-waarde in een numerieke context, de opgehaalde waarde heeft bits set
overeenkomend met de setleden waaruit de kolomwaarde bestaat. Voor
u kunt bijvoorbeeld numerieke waarden uit een SET-kolom als volgt ophalen:

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

Als een getal is opgeslagen in een SET-kolom, worden de bits die zijn ingesteld in de
binaire representatie van het getal bepalen de set leden in de
kolom waarde. Voor een kolom gespecificeerd als SET(‘a’,’b’,’c’,’d’), de
leden hebben de volgende decimale en binaire waarden.

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

Als u een waarde van 9 toekent aan deze kolom, is dat 1001 in binair, dus
de eerste en vierde SET-waardeleden ‘a’ en ‘d’ worden geselecteerd en
de resulterende waarde is ‘a,d’.

Other episodes