PostgreSQL, проблемы с хранением значений логического типа как T и F, нарушающие ORM

Если я определяю логический тип данных в таблице Postgres и делаю запрос из него, результаты для логических столбцов возвращаются как «t» или «f».

Я использую NPGSQL в качестве драйвера и Dapper в качестве ORM. Это вызывает проблему, потому что Dapper не может преобразовать "t" или "f" в логическое значение, и все логические значения заканчиваются как False.

Есть ли способ изменить это поведение с помощью Postgres, или мне нужно взломать его, используя символьный тип данных?


person Jonathan Holland    schedule 23.07.2011    source источник
comment
Dapper нужны значения, которые может обрабатывать логический тип .NET (true/false), он не будет работать с T/F/Yes/No/On/Off/0/1 и т. д.   -  person Jonathan Holland    schedule 23.07.2011
comment
Это похоже на ошибку (или неправильную настройку) в драйвере. Надлежащий драйвер должен преобразовывать значения данных между типами базы данных и типами языка клиента.   -  person Peter Eisentraut    schedule 24.07.2011
comment
Питер, это ошибка в NPGSQL, я могу исправить ее и посмотреть, примут ли они заявку, я бы хотел, чтобы у них был github/bitbucket вместо частной системы CVS :(   -  person Jonathan Holland    schedule 24.07.2011
comment
Привет, вы знаете, где Dapper получает значение от Npgsql, который, в свою очередь, возвращает неправильное значение? Если он вызывает NpgsqlDataReader.GetValue(int), он должен получить логическое значение. Если возможно, не могли бы вы прислать нам тестовый пример? Наш код cvs можно найти по адресу: cvs.npgsql.org. Я надеюсь, что это помогает.   -  person Francisco Junior    schedule 21.08.2011
comment
какую версию npgsql вы использовали, когда столкнулись с этой ошибкой?   -  person bagz_man    schedule 23.10.2013


Ответы (1)


Приведите его к целому числу, чтобы получить 0 или 1

SELECT boolean_value::INT ;

или varchar, чтобы получить «истина» или «ложь».

SELECT boolean_value::VARCHAR ;

Большинство драйверов БД должны иметь возможность обрабатывать одно или другое.

person Mika Tähtinen    schedule 23.07.2011
comment
Я не хотел изменять все запросы для использования приведения типов, но если нет возможности изменить поведение по умолчанию, это придется сделать. - person Jonathan Holland; 23.07.2011
comment
Логический тип данных в postgres немного отстойный, поскольку он также занимает 1 байт памяти, поэтому во многих случаях я использую значения состояния char(1) вместо логических, поскольку нередко требуется больше значений для переменных, которые кажутся логическими на первый взгляд. . - person Mika Tähtinen; 23.07.2011