Сервер базы данных Advantage (ADS) тип данных CIChar НЕ ЯВЛЯЕТСЯ ПОЛНЫМ

#sql #case-insensitive #advantage-database-server #isnull

#sql #без учета регистра #advantage-сервер баз данных #isnull

Вопрос:

К сожалению, мы используем сервер баз данных Advantage Torture Edition версии 8.1. После того, как я закончил свой проект, я услышал, что база данных настроена с учетом регистра. Итак, я изменил структуру таблицы, все типы данных Char на CIChar, который является полем char, нечувствительным к регистру. Но я получаю эту ошибку при выполнении моей программы:

 Advantage.Data.Provider.AdsException:
  

Ошибка 7200: Ошибка AQE: Состояние =
HY000; NativeError = 2214;
[Расширенные системы][Advantage SQL
Движок] Недопустимое принуждение: результат
выражение является неоднозначным символом
введите.

Я обнаружил, что ISNULL(myciChar,») вызывает эту проблему, но я не понимаю, ПОЧЕМУ? Как я мог бы решить эту проблему? Существуют ли другие известные проблемы с типом данных cichar?

Любая помощь будет оценена. Спасибо.

[обновить]

Я нашел причину этой ошибки. Необходимо уточнить два момента.

  1. База данных имеет версию 8.1, но архитектор данных имеет версию 7.1, и в локальном режиме он использует движок architect engine версии 7.1. Это означает, что это проблема версии 7.1.
  2. Второй параметр в функции isnull в версии 7.1 используется для сортировки с учетом регистра по умолчанию, в то время как мой столбец mytext имеет значение cichar, и это неоднозначный символьный тип. Так что, если у кого-то такая же проблема, она будет работать в версии 7.1 с объявлением collate:

работает в версии 7.1:

 select myid, isnull(mytext, '-' COLLATE ads_default_ci) as mytext from mytable
  

ошибка в версии 7.1:

 select myid, isnull(mytext, '-') as mytext from mytable
  

Ответ №1:

Вероятно, нужно просмотреть больше вашего выражения, чтобы понять, почему вы получаете эту ошибку. Это имеет не столько отношение к ISNULL, сколько к выражению, в котором используется ISNULL. Вероятно, движок столкнулся со сравнением и не смог автоматически определить, хотите ли вы, чтобы сравнение учитывало регистр или нет. Смотрите документацию, в которой описывается приоритет без учета регистра и принудительное использование.

Если он не используется в выражении, это может быть просто ошибкой (я только что попробовал с 10.1, и это сработало), убедитесь, что вы используете последнюю версию 8.1, которая является 8.10.0.38

Ответ №2:

Я не думаю, что версия 7 поддерживает тип данных cichar, версия 6, безусловно, этого не делает. Я использовал версию 6 и сразу перешел к версии 8 и обнаружил, что все работало с драйвером клиента версии 6, пока я не использовал тип данных cichar, а затем игра для Advantage была закончена. Затем мне пришлось обновить все клиенты до той же версии, что и сервер. Лучше всего сохранить все версии одинаковыми.