2012-06-14 19 views
6

Skanuję 5000 plików CSV do bazy danych. Niestety pliki mają '', dla 0. Tak więc, kiedy uruchomię mój skrypt, ulega awarii. Słyszałem, że tego błędu można uniknąć, po prostu wyłączając tryb ścisły. Tak więc spróbowałem wyłączyć tryb ścisły, aby umożliwić mi czytanie w pustym ciągu jako 0 dla pól numerycznych. Jednak błąd utrzymywał się.Wyłączanie trybu ścisłego MySQL

Czy wyłączenie trybu ścisłego pozwala na odczytanie pola int? (The '' to dwie qoutes czyli ciąg pusty)

Jeśli tak to dlaczego ustawień

sql_mode = ''

w my.ini pliku konfiguracyjnym nie rozwiązać problem.

Dziękujemy!

Odpowiedz

17

Przypuszczam, że importujesz plik CSV za pomocą komendy LOAD DATA INFILE. Przed uruchomieniem tego polecenia wpisz:

SET sql_mode = ''; 

Więcej informacji na temat różnych trybów SQL można znaleźć w documentation.

+1

Tak, masz rację. To działa idealnie. Jestem nieco zakłopotany, dlaczego ustawienie nie zostało spełnione, ale wywołanie tego tuż przed uruchomieniem polecenia LOAD DATA. Dzięki. – Orlan

+0

Link nie działa. [Kliknij tutaj, aby zapoznać się z dokumentacją] (https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-setting) i szczegółowe informacje o ** trybach SQL Server ** – gentleboy

1

Możesz modyfikować swoje oświadczenie LOAD DATA INFILE, aby poprawić wartości. Coś w tym kierunku powinno zadziałać.

LOAD DATA INFILE 'filepath.csv' 
INTO TABLE MyTable(Column1,@Col2,@Col3) 
SET Column2=CASE WHEN @Col2 = '' THEN 0 ELSE @Col2 END 
,Column3=CASE WHEN @Col3 = '' THEN 0 ELSE @Col3 END; 

To zapytanie importuje wartość jak w Kolumnie1 oraz ustala wartości dla kolumn 2 i 3. Korzystanie z tego, że nie trzeba wyłączyć tryb ścisły, i rzeczywiście jesteś w kontroli, jakie dane trafia do twojej bazy danych, są w stanie go naprawić w niezawodny sposób. Możesz także użyć tej funkcji do zmiany formatów daty lub importowania zakropkowanych wartości BLOB. Bardzo przydatna funkcja.

+0

Ładne rozwiązanie . Nie wiedziałem, że możliwe jest przetwarzanie przepływu danych w tym momencie. – jkrcma

0

Wstawiam to w odpowiedzi, ponieważ nie mam jeszcze przedstawiciela, który mógłby skomentować następne pytanie dotyczące ustawień, a nie "wstrzymywać". Moje doświadczenie z MySQL było takie, że ustawienia w pliku konfiguracyjnym są odczytywane tylko przy uruchamianiu serwera, abyś musiał zrestartować serwer, aby nowe ustawienia zaczęły obowiązywać.

Serwer jest demonem, z którym komunikuje się klient wiersza komend podczas uruchamiania komend, aby ponowne uruchomienie klienta wiersza poleceń nie uruchomiło ponownie samego serwera.

W odpowiedzi znajduje się bardziej szczegółowe wyjaśnienie: https://serverfault.com/a/79051.

1

muszę zrobić to w ten, a działa poprawnie:

  1. Aby wyłączyć tryb ścisły SQL, SSH do serwera jako root
  2. Tworzenie tego pliku: /etc/mysql/conf.d/ disable_strict_mode.CNF
  3. Otwórz plik i wprowadzić te dwie linie:

    [mysqld] sql_mode = IGNORE_SPACE, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

  4. Restart MySQL z tym poleceniem: obsługa sudo mysql restart

Powiązane problemy