2011-11-17 15 views
8

Próbuję zrozumieć, w jaki sposób można użyć wyrażeń w mysql. Jeśli wstawię cokolwiek do wyliczonego pola, które nie jest typu wyliczeniowego - mysql wstawia pusty ciąg znaków (z wartością 0).MySQL wylicza pustą wartość

  • owoce ENUM ("APPLE", "BANANA", "PEACH");
  • INSERT ... owoce = 'bannana'

Prosty błąd ortograficzny i MySQL wstawia pustą wartość, łamie integralność danych i sprawia, że ​​teksty stałe niezwykle bezużyteczne.

ograniczenia CHECK może pomóc tutaj, ale MySQL nie obsługuje (dość zabawne dla „najpopularniejszego” bazy w roku 2011)

Jedynym sposobem, widzę to napisać spust aby zapobiec pusty łańcuch, ale to jest zbyt dużo pracować, aby napisać wyzwalacz dla tak prostego przypadku.

Czy istnieje sposób na wyłączenie "pustego ciągu" zachowania MySQL dla wyliczenia?

Dzięki

Odpowiedz

4

przyjrzeć trybach sql

SET SQL_MODE='TRADITIONAL'; 
8

Jak na documentation:

Po włożeniu nieprawidłową wartość do wyliczenia (czyli ciąg nie występuje na liście dozwolonych wartości), zamiast tego wstawiany jest pusty ciąg znaków jako specjalna wartość błędu. Łańcuch ten można odróżnić od "normalnego" pustego łańcucha przez fakt, że ten ciąg ma wartość liczbową 0.

Zalecamy unikanie wyliczeń, ponieważ są one niezbyt wydajne na stronie internetowej (and others).

Jeśli naprawdę potrzebujesz wyliczenia, rozważ użycie trybu ścisłego. W trybie ścisłym przynajmniej wystąpi błąd przy próbie wstawienia nieprawidłowej wartości do kolumny ENUM. W przeciwnym razie generowane jest tylko ostrzeżenie, a wartość jest po prostu ustawiona na pusty ciąg "" (odwoływany wewnętrznie jako 0). Uwaga: Błędy mogą nadal być blokowane w trybie ścisłym, jeśli używasz IGNORE.

Oto link do documentation on setting your MySQL server mode.

Szczęśliwe kodowanie!

Aktualizacja: Odpowiedź Nicka jest jednym ze sposobów ustawienia serwera w trybie ścisłym. Tryb TRADYCYJNY jest równoważny trybowi STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, należy więc pamiętać o dodatkowej walidacji danych przeprowadzonej na innych typach danych, na przykład DATE.

Powiązane problemy