Почему запрос выполнятся под Windows, а под Linux ошибка: "ORA-01722: invalid number"?
Есть Python/SQL скрипт, который написан под Windows.
Все элементарно просто, выполняю запрос и делаю fetchall().
Проблема начинается, когда я пытаюсь запустить этот же скрипт на сервере Linux. Запрос выполняется точно такое же время как и под Windows, но при выполнении fetchall() даёт ошибку:
cx_Oracle.DatabaseError: ORA-01722: invalid number
Запрос просто select, и итоговая выборка примерно 3000 строк.
Устанвливаю соединение:
connection = cx_Oracle.connect(user_name, password, dsn_tns,encoding='UTF-8',nencoding='UTF-8')
cursor = connection.cursor()
cursor.execute(_SQL)
Под Windows - всё нормально, а под Linux - ошибка
В какую сторону смотреть? В чем может быть проблема?
Ответы (1 шт):
Всё очень просто. Запрос содержит неявное преобразование типов данных.
Например, даты или числа в строчное значение (или наоборот). Так как национальные настройки на Windows и Linux могут отличаться, то выполненение одного и того же запроса под разными ОС может привести, как в вопросе, к ошибкам, или, что гораздо хуже, к различным результатам запроса.
Решение (первое предпочтительней):
- Изменить запрос так, чтобы он содержал только явные преобразования типов данных.
- Переменной окружения
NLS_LANGустановить одинаковые национальные настройки сессий на обоих системах.
Простейший пример того, что может привести к ошибке:
select 0 + '1,23' res from dual;
RES
----------
1,23
А теперь:
alter session set nls_territory='America'
/
select 0 + '1,23' res from dual;
ORA-01722: invalid number