2011-02-09 11 views
8

Dostaję dziwny błąd 'okrojona nieprawidłowa wartość INTEGER' kiedy uruchomić następujące zapytanie UPDATE:MySQL okrojona nieprawidłowa wartość INTEGER "

update tbl 
set projectNumber = right(comments, 7) 
where createdBy = 'me' 
and length(CONVERT(right(comments, 7), SIGNED INTEGER)) = 7 
and CONVERT(right(comments, 7), SIGNED INTEGER) > 0 
and CONVERT(right(comments, 7), SIGNED INTEGER) is not null 
and createdOn > '2011-01-31 12:00:00' 
and projectNumber is null 

projectNumber jest varchar (10).

Po uruchomieniu go jako wybór prosty nie otrzymuję błędu i wyniki są zgodne z oczekiwaniami. Jakieś pomysły? Zasadniczo próbuję zaktualizować pole ProjectNumber, w którym koniec komentarzy w zaimportowanych notatkach to 7 znaków numerycznych (ale numer projektu nie jest zawsze numeryczny, dlatego pole to varchar (10)).

Odpowiedz

8

To nie jest błąd. Jest to ostrzeżenie, które pochodzi z CONVERT(), gdy poprosisz go o konwersję nieliczbową na całkowitą;

Run te kwerendy w konsoli, aby zobaczyć:

mysql> SELECT CONVERT(right('1s23d45678', 7), SIGNED INTEGER); 
+-------------------------------------------------+ 
| CONVERT(right('1s23d45678', 7), SIGNED INTEGER) | 
+-------------------------------------------------+ 
|            3 | 
+-------------------------------------------------+ 
1 row in set, 1 warning (0.00 sec) 

mysql> SHOW WARNINGS; 
+---------+------+----------------------------------------------+ 
| Level | Code | Message          | 
+---------+------+----------------------------------------------+ 
| Warning | 1292 | Truncated incorrect INTEGER value: '3d45678' | 
+---------+------+----------------------------------------------+ 
1 row in set (0.00 sec) 

Jak powiedziałem, jest to ostrzeżenie, a nie błąd. Twoje zapytanie powinno poprawnie wykonać aktualizację.

+2

interesujące. Mówi kod błędu 1292 (jak na przykład), ale mogę potwierdzić, że aktualizacja * nie * działa. Czy muszę mieć możliwość przerywania ostrzeżeń w aktualizacjach? Będę dalej kopać. –

+3

Podejrzewam, że twój serwer działa w trybie "TRADITIONAL' SQL, który konwertuje wszystkie ostrzeżenia na błędy. http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html#sqlmode_traditional – Mchl

+3

Dobrze. Właściwie zdecydowałem się po prostu użyć wyrażenia regularnego (i prawego (komentarze, 7) REGEXP '^ [0-9] + $') i zapomnieć o konwertowaniu nonsensu. Działało dobrze. Dziękuję bardzo za Twoją pomoc. –

4

Inną częstą przyczyną tego ostrzeżenia jest biała spacja w ciągu, który ma zostać przekonwertowany. Użyj trim() przed convert(), aby się tego pozbyć.

0

Jeśli używasz typ tekstu dla danych kolumny i próbował ustawić domyślną wartość jako 0 potem po prostu ustawić go jako NULL:

ALTER TABLE `__table__` 
CHANGE `__column_name__old__` `__column_name__new__` 
INT(4) NOT NULL DEFAULT '0'; 
Powiązane problemy