Ошибка неверное значение для целого числа postgresql

Собственно запрос

Select t_id,end_data, 
case when tbl_city.NAZV is null then tc_name else tc_name || ', ' || NAZV end || ', ' || address as NAZV, 
case status when 0 then 'Не подтверждена' when 1 then 'Подтверждена' when 2 then 'В работе' when 3 then 'На проверке' else 'Закрыта' end as st,
case when cell_ticket is null then 'Не назначено' else cell_ticket end as st,
case when cell_ticket is null then 'Не указано' else cell_ticket end as cell
from us_ticket.ticket
join us_ticket.tbl_countryside on ticket.city_id = tbl_countryside.tc_id
left join us_ticket.tbl_city on tbl_countryside.citycode = tbl_city.city_id;

Ошибка на строке

case when cell_ticket is null then 'Не указано' else cell_ticket end as cell

Как только ее убираю все начинает работать. Ругается на эту часть then "Не указано"

Текст ошибки

ОШИБКА: неверное значение для целого числа: «Не указано»
СТРОКА 1: …та’ end as st, case when cell_ticket is null then ‘Не указан…

Я уже искал и пытался исправить ошибку, но я не мог этого сделать. В чем проблема внутри моего кода? Я вставлю код и ошибку ниже. Как я понимаю, это о типе данных. Если я сделаю какие-либо грамматические ошибки, извините за это.

$sql = <<<SQL
INSERT INTO karakter (KullanıcıAdı,uid,Isim,Cinsiyet,Irk,Boy,Kilo,Gün,Ay,Yıl,Güç,Bünye,Dayanıklılık,Çeviklik,Karizma,Zeka,İrade,Odaklanma,Ustalık,Ziraat,İşçilik,Aşçılık,Botanik,Balıkçılık,Dericilik,Marangozluk,Hekimlik,VahşiYaşam,DuvarUstalığı,Camcılık,Demircilik,Avcılık,Şarapçılık,Çekilme,Kalkan,Hançer,Kılıç,Balta,Gürz,Mızrak,Yay,Arbalet)
VALUES ("$user","$uid","$isim","$cinsiyet","$irk","$boy","$kilo","$gun","$ay","$yil","$Güç","$Bünye","$Dayanıklılık","$Çeviklik","$Karizma","$Zeka","$İrade","$Odaklanma","$Ustalık",'$Ziraat',"$İşçilik","$Aşçılık","$Botanik","$Balıkçılık","$Dericilik","$Marangozluk","$Hekimlik","$VahşiYaşam","$DuvarUstalığı","$Camcılık","$Demircilik","$Avcılık","$Şarapçılık","$Çekilme","$Kalkan","$Hançer","$Kılıç","$Balta","$Gürz","$Mızrak","$Yay","$Arbalet")
ON DUPLICATE KEY UPDATE
KullanıcıAdı=VALUES(KullanıcıAdı),
uid=VALUES(uid),
Isim=VALUES(Isim),
Cinsiyet=VALUES(Cinsiyet),
Irk=VALUES(Irk),
Boy=VALUES(Boy),
Kilo=VALUES(Kilo),
Gün=VALUES(Gün),
Ay=VALUES(Ay),
Yıl=VALUES(Yıl),
Güç=VALUES(Güç),
Bünye=VALUES(Bünye),
Dayanıklılık=VALUES(Dayanıklılık),
Çeviklik=VALUES(Çeviklik),
Karizma=VALUES(Karizma),
Zeka=VALUES(Zeka),
İrade=VALUES(İrade),
Odaklanma=VALUES(Odaklanma),
Ustalık=VALUES(Ustalık),
Ziraat=VALUES(Ziraat),
İşçilik=VALUES(İşçilik),
Aşçılık=VALUES(Aşçılık),
Botanik=VALUES(Botanik)
SQL;

Ошибка:

Неверное целочисленное значение: » для столбца ‘Ziraat’ в строке 1

3

240 / 34 / 7

Регистрация: 05.05.2012

Сообщений: 515

1

26.10.2015, 14:03. Показов 25628. Ответов 23


Студворк — интернет-сервис помощи студентам

Добрый день! Скажите, пожалуйста. Можно в PostgreSQL как-нибудь автоматически заполнить таблицу данными из Excel?



0



1213 / 938 / 373

Регистрация: 02.09.2012

Сообщений: 2,862

26.10.2015, 14:25

2

напрямую в excel не уверен, что такое есть… но есть запись данных в CSV-файл. см. COPY



1



240 / 34 / 7

Регистрация: 05.05.2012

Сообщений: 515

27.10.2015, 07:04

 [ТС]

3

У меня прав нет:
ОШИБКА: для использования COPY с файлами нужно быть суперпользователем
HINT: Не имея административных прав, можно использовать COPY с stdout и stdin (а также команду psql copy).

Я еще пробовала через интерфейс pgAdmin III сделать. Выбираю таблицу, в меню выбираю Импорт. Открывается окно: ‘Import data from file into tablename’ Нужно выбрать формат и кодировку. Формат выбираю csv, кодировку — по умолчанию UTF8. Жму Импорт. Выдает ошибку: Неверная последовательность байт для кодировки UTF8.



0



grgdvo

1213 / 938 / 373

Регистрация: 02.09.2012

Сообщений: 2,862

27.10.2015, 07:43

4

Да, забыл про права суперпользователя…

Для psql тоже достаточно легко делается

Bash
1
psql -c "copy mytable from mydata.csv (format csv)" mydb -U myuser

Цитата
Сообщение от Simply me
Посмотреть сообщение

Жму Импорт. Выдает ошибку: Неверная последовательность байт для кодировки UTF8.

А выбранный файл точно имеет кодировку UTF8??? Я вот у себя решил проверить, все импортиться прекрасно.



1



240 / 34 / 7

Регистрация: 05.05.2012

Сообщений: 515

27.10.2015, 08:14

 [ТС]

5

Цитата
Сообщение от grgdvo
Посмотреть сообщение

А выбранный файл точно имеет кодировку UTF8???

Не точно. Я что-то не помню, как проверить кодировку. Файл экселевский.



0



grgdvo

1213 / 938 / 373

Регистрация: 02.09.2012

Сообщений: 2,862

27.10.2015, 08:21

6

Вы на windows или linux?
Если windows, то с большой долей вероятности excel создаст csv-файл в кодировке win1251.
В linux

Bash
1
enca filename.csv



0



240 / 34 / 7

Регистрация: 05.05.2012

Сообщений: 515

27.10.2015, 08:25

 [ТС]

7

Windows. Выбрала кодировку win1251. Все равно ошибка.
Неверная последовательность байт для кодировки «WIN1251»



0



1213 / 938 / 373

Регистрация: 02.09.2012

Сообщений: 2,862

27.10.2015, 08:44

8

Может тогда cp866 )
В windows уже не работаю, раньше помню FarManager умел кодировки показывать.

Добавлено через 6 минут
Проверил у себя в виртуалке… У меня 2007 эксель стоит… сохраняет как CSV (MSDOS) — это кодировка cp866



0



240 / 34 / 7

Регистрация: 05.05.2012

Сообщений: 515

27.10.2015, 09:44

 [ТС]

9

У меня нет такого варианта. Есть вариант WIN866
Вообщем перемерила все предлагаемые кодировки. Везде одна и та же ошибка: Неверная последовательность байт для кодировки…
А при проверке кодировки MULE_INTERNAL ошибка: Неверное значение для целого числа «…» И там какие-то косячные символы.



0



1213 / 938 / 373

Регистрация: 02.09.2012

Сообщений: 2,862

27.10.2015, 09:55

10

Полагаю стоит заново начать с экспорта в экселе, заново сделать CSV-файл, открыть его тем же notepad’ом и посмотреть, что там внутри. Я сейчас не могу проверить WIN866, но позже просто ради интереса попробую.



0



240 / 34 / 7

Регистрация: 05.05.2012

Сообщений: 515

27.10.2015, 10:43

 [ТС]

11

Я не очень поняла) Это не экспортированный файл. Просто экселевский файл. Сама создавала. Сейчас сохранила как csv. Открыла notepad’ом. Там все нормально отображается, только вместо границ ячеек ‘;’ Зашла в Notepad на вкладку Кодировки. Там отмечена Кодировка в UTF-8 (без BOM).



0



1213 / 938 / 373

Регистрация: 02.09.2012

Сообщений: 2,862

27.10.2015, 12:59

12

Ну теперь импорт полученного csv-файла делайте в postgresql. что получится?



0



240 / 34 / 7

Регистрация: 05.05.2012

Сообщений: 515

27.10.2015, 13:12

 [ТС]

13

grgdvo, спасибо! С кодировкой понятно Теперь с типами проблемы. У меня в этом файле 1 запись. Первый столбец — idшник, остальные — null. При импорте пишет ошибку: неверное значение для целого числа: «139;;;;;;;;;;;;» Почему-то он не понимает, что точка с запятой к следующим столбцам относится.

Добавлено через 2 минуты
Я просто раньше не работала с БД



0



1213 / 938 / 373

Регистрация: 02.09.2012

Сообщений: 2,862

27.10.2015, 13:33

14

Цитата
Сообщение от Simply me
Посмотреть сообщение

точка с запятой к следующим столбцам относится.

Нужно указать, что разделителем полей будет «точка с запятой», по умолчанию «запятая» используется (от CSV = Comma-Separated Values). Но Excel почему-то решил, что надо непременно «;» использовать.
Вот снимок экрана моего pgadmin. При импорте поменяйте разделитель. Еще возможно с NULL-значениями придется поработать, если у вас в файле есть такие пустоты со значениями. Также нужно по структуре таблицы пройтись. У вас количество полей соответствует количество колонок в excel?? возможно придется указать порядок колонок.

Импорт данных из Excel



1



240 / 34 / 7

Регистрация: 05.05.2012

Сообщений: 515

27.10.2015, 13:48

 [ТС]

15

Спасибо,grgdvo, получилось импортировать!)) Последний вопрос. У меня десятичный разделитель был запятая, перед импортом я заменила ее на точку. Потом я буду импортировать файл, где 6000 записей, и тоже везде десятичный разделитель запятая. Лучше в Excel везде поменять на точку или можно где-нибудь при импорте указать, что десятичный разделитель запятая?



0



1213 / 938 / 373

Регистрация: 02.09.2012

Сообщений: 2,862

27.10.2015, 14:07

16

Будет проще и быстрее поменять в экселе запятую на точку, чем городить с локализацией и восприятием формата вещественного числа.



1



240 / 34 / 7

Регистрация: 05.05.2012

Сообщений: 515

27.10.2015, 14:09

 [ТС]

17

Ясно, спасибо!



0



240 / 34 / 7

Регистрация: 05.05.2012

Сообщений: 515

29.10.2015, 07:24

 [ТС]

18

grgdvo, а Вы пробовали импортировать столбцы, в которых есть кириллица? У таких столбцов все-таки проблема с кодировкой



0



1213 / 938 / 373

Регистрация: 02.09.2012

Сообщений: 2,862

29.10.2015, 13:27

19

У меня CSV-файл был в кодировке UTF-8 и база данных создана в UTF-8. Все импортировалось успешно!



0



240 / 34 / 7

Регистрация: 05.05.2012

Сообщений: 515

29.10.2015, 13:29

 [ТС]

20

А где проверить кодировки CSV-файла и базы данных?



0



i have a table:

                id | detail
                 1 | ddsffdfdf ;df, deef,"dgfgf",/dfdf/

when I did: insert into details values(1,'ddsffdfdf ;df, deef'); => got inserted properly
When I copied that inserted value from database to a file,the file had: 1 ddsffdfdf ;df, deef
Then I loaded the whole csv file to pgsql database,with values in the format: 1 ddsffdfdf ;df, deef
ERROR: invalid input syntax for integer: «1 ddsffdfdf ;df, deef is obtained. How to solve the problem?

asked May 29, 2015 at 11:25

user3823859's user avatar

user3823859user3823859

4691 gold badge7 silver badges20 bronze badges

3

CSVs need a delimiter that Postgres will recognize to break the text into respective fields. Your delimiter is a space, which is insufficient. Your CSV file should look more like:

1,"ddsffdfdf df, deef"

And your SQL should look like:

COPY details FROM 'filename' WITH CSV;

The WITH CSV is important because it tells Postgres to use a comma as the delimiter and parses your values based on that. Because your second field contains a comma, you want to enclose its value in quotes so that its comma is not mistaken for a delimiter.

To look at a good example of a properly formatted CSV file, you can output your current table:

COPY details TO '/your/filename.csv' WITH CSV;

answered May 29, 2015 at 11:29

vol7ron's user avatar

vol7ronvol7ron

40.4k21 gold badges117 silver badges172 bronze badges

14

Активист


  • #1

C PostgreSQL не работа, но надо пару задач сделать. Подскажите, нужно безусловное приводение типов к int / decimal. Что бы не валилась ошибка, а то валится в FATAL, ибо обработчик такой:

PHP:

<?php
/**
* Класс для работы с базой данных PostgreSQL
*/
class app_db_pgsql
{
    /**
    * Аттрибут объекта содержит текущую ссылку на соединение с СУБД (connection id)
    * @var resource|null
    */
    private static $connection_id;

    /**
    * Аттрибут содержит ресурс выполненный функцией pg_execute
    * @var resource
    */
    private $_last_pg_query_resource;

    /**
    * Метод выполняет соединение с postgresql или если соединение установлено возвращает текущий линк
    * @return resource
    */
    private function connection_id()
    {
        if (!isset(self::$connection_id))
        {
            if (! (self::$connection_id = pg_connect("host=localhost dbname=db user=use password=pass")) )
            {
                trigger_error("Ошибка соединения с базой данных PostgreSQL: ".pg_last_error(), E_USER_ERROR);
            }
       
            pg_set_client_encoding(self::$connection_id, "koi8-r"); // устанавлиаем кодировку клиента в соотвествии с кодировкой сайта
        }
   
        return self::$connection_id;
    }

    /**
    * Метод подготовки SQL запроса
    * @param unknown $query
    * @return boolean
    */
    public function prepare($query)
    {
        if (! pg_prepare($this->connection_id(), "", $query) )
        {
            trigger_error("Подготовка SQL запроса {$query} завершилось неудачно: ".pg_last_error($this->connection_id()), E_USER_ERROR);
        }
   
        return $this;
    }

    /**
    * Выполняем подготовленный SQL запрос
    * @param array $params
    * @return app_db_pgsql
    */
    public function execute(array $params = array())
    {
        if (! ($this->_last_pg_query_resource = pg_execute($this->connection_id(), "", $params)) )
        {
            trigger_error("Выполнение ранее подгтовленного запроса произошло с ошибкой: ".pg_last_error($this->connection_id()), E_USER_ERROR);
        }
   
        return $this;
    }

    /**
    * Получаем строку
    * @return array
    */
    public function fetch_row()
    {
        return pg_fetch_row($this->_last_pg_query_resource);
    }

    /**
    * Получаем строку (ассоциативный массив)
    * @return array
    */
    public function fetch_assoc()
    {
        return pg_fetch_assoc($this->_last_pg_query_resource);
    }


    /**
    * Выполняет SQL без предподготовки, но с параметрами
    * @param string $query
    * @param array $params
    * @return app_db_pgsql
    */
    public function query_params($query, array $params = array())
    {
        if (! ($this->_last_pg_query_resource = pg_query_params($this->connection_id(), $query, $params)) )
        {
            trigger_error("Выполнение запроса c параметрами произошло с ошибкой: ".pg_last_error($this->connection_id()), E_USER_ERROR);
        }
   
        return $this;
    }

    /**
    * Возвращает количество затронутых строк
    * @return number
    */
    public function num_rows()
    {
        return pg_num_rows($this->_last_pg_query_resource);
    }
}

Пробовал собственно так:

PHP:

public function getTwByCode($tw_code)
    {
        $pg = new app_db_pgsql();
        $pg->query_params("select * from type_of_work where tw_code = cast($1 as int8)", array($tw_code));
       
        if ($pg->num_rows() === 1)
        {
                return $pg->fetch_assoc();
        }
       return false;
    }

Валится с ошибкой , в случае плохого INT’а:

Код:

Warning: pg_query_params() [function.pg-query-params]: Query failed: ОШИБКА: неверное значение для целого числа: "a" in /var/www/x.web.local/httpdocs/x/app/db/pgsql.php on line 95

Fatal error: Выполнение запроса c параметрами произошло с ошибкой: ОШИБКА: неверное значение для целого числа: "a" in /var/www/x.web.local/httpdocs/x/app/db/pgsql.php on line 97

На PHP приводить к unsigned int не вариант (поскольку максимального значения для PHP-шного INT меньше чем bigint PostreSQL)

Последнее редактирование: 19 Май 2014

Активист


  • #3

Вот в чем проблема:

is_number не подойдет, ибо:

Код:

Warning: pg_query_params() [function.pg-query-params]: Query failed: ОШИБКА: значение "9223372036854775808" вне диапазона для типа bigint in /var/www/x.web.local/httpdocs/x/app/db/pgsql.php on line 95

Fatal error: Выполнение запроса c параметрами произошло с ошибкой: ОШИБКА: значение "9223372036854775808" вне диапазона для типа bigint in /var/www/x.web.local/httpdocs/x/app/db/pgsql.php on line 97

  • #4

preg_match() + сравнение строк.

  • #5

Подскажите, нужно безусловное приводение типов к int / decimal. Что бы не валилась ошибка…

А к какому числу это безусловное приведение должно приводить букву «a» или число за пределами диапазона int8?

  • #6

Вот кстати придумалось Элегантное Решение:

Код:

create function shit_to_integer(incoming_shit text, default_shit int8 default null)
returns int8
as $$
begin
  begin
    return incoming_shit::int8;
  exception
    when numeric_value_out_of_range or invalid_text_representation then
      return default_shit;
  end;
end;
$$ language plpgsql immutable called on null input security definer;

Соответственно shit_to_integer(‘a’) вернёт нам null, shit_to_integer(‘a’, 666) вернёт 666.

Активист


  • #7

А к какому числу это безусловное приведение должно приводить букву «a» или число за пределами диапазона int8?

Есть два варианта:
1. Передано не число;
2. Передано число за приделами.

MySQL приводит к пустоте (но не NULL), насколько я знаю. В MySQL проверка входных данных и генерация ошибок , подобных PG — это strict mode, который отключается.

1 — ое еще теститься на валидацию;
2 — ое уже нельзя проверить, в PHP.

За функцию спасибо)

Последнее редактирование: 20 Май 2014

Понравилась статья? Поделить с друзьями:
  • Ошибка неверное выражение pascal abc
  • Ошибка неверно указана единица измерения word как убрать
  • Ошибка неверно задано имя папки на windows 10
  • Ошибка неверно введено значение уин
  • Ошибка неверно введена капча что это