#visual-foxpro #foxpro
#visual-foxpro #foxpro
Вопрос:
?"ABC">"A"
ВОЗВРАТ.F.
?"ABC">"B"
ВОЗВРАТ.F.
?"ABC">"a"
ВОЗВРАТ.T.
Похоже, это не сравнение ASCII (как в других распространенных языках программирования).
Я искал MSDN, однако реляционные операторы объясняли сравнение только по числовому типу или логическому. Сравнение строк и значений не упоминало операторов lt / gt / lte / gte.
Почему сравнение строк работает именно так? Каковы внутренние правила VFP для сравнения строк lt / gt?
Ответ №1:
На самом деле сравнение строк VFP не сильно отличается от сравнения на других языках (некоторые языки, например: C #, даже не позволяют использовать >=, >, <= и < со строками). Однако в VFP есть один параметр, который влияет на сравнение строк, и он «УСТАНОВЛЕН ТОЧНО». Кроме этого, строки VFP чувствительны к регистру, поэтому «ABC»> «a» равно false (альфа-сортировка основана на их кодах символов ASCII).
При ВЫКЛЮЧЕННОМ значении ПО умолчанию строки сравниваются с точностью до длины правого операнда. т.е.: «ABC» = «A»
сравнивается следующим образом: «A» = «A»
таким образом, они равны, поэтому «ABC»> «A» равно false (а также «ABC» < «A» равно false, «ABC» = «A» равно true).
Напомним, что по умолчанию УСТАНОВЛЕНА ТОЧНАЯ настройка, которая ОТКЛЮЧЕНА: «ABC» = «A» (но «A» = «ABC» равно false — сравните с длиной правого операнда).
И в алфавитном порядке используется код ASCII.
SET EXACT OFF amp;amp; Default if not set explicitly
? "ABC" = "A" amp;amp; .T.
? "ABC" > "A" amp;amp; .F.
? "ABC" < "B" amp;amp; .T.
SET EXACT ON
? "ABC" = "A" amp;amp; .F.
? "ABC" > "A" amp;amp; .T.
? "ABC" < "B" amp;amp; .T.
Особое примечание: если вы выполняете эту проверку равенства в командах SQL, то там применяются правила ANSI, и SET EXACT не имеет никакого эффекта. По умолчанию значение ANSI отключено, а «ABC» = «A» (и из-за правил SQL изменение левой и правой сторон операндов не имеет значения, поэтому «A» = «ABC» также верно). ie:
Select * from myTable where firstName = "A"
будут возвращены записи с именем «Энтони», «Алиса»… и так далее.
В VFP есть специальный оператор == (точно равный), который работает независимо от ЗАДАННЫХ ТОЧНЫХ или заданных настроек ANSI. Будьте осторожны, его поведение отличается от обычных команд и команд SQL. С обычными командами это действительно означает «точно равно», включая конечные пробелы в обеих сравниваемых строках. ie:
? 'ABC' == 'ABC ' amp;amp; false, regardless of SET EXACT
Однако с SQL (независимо от установленного параметра ANSI):
select * from myTable where myField == 'A'
select * from myTable where myField == 'A '
select * from myTable where myField == 'A '
все они означают одно и то же и выполняют поиск записей, содержимое MyField которых равно A (независимо от размера поля — конечные пробелы с обеих сторон сравнения игнорируются).
Примечание: я думаю, вы можете запросить добавление разделов документа в stack overflow. Документация по VFP только началась, и никаких дополнений еще не сделано, AFAIK.
Комментарии:
1. Я обнаружил, что независимо от того, включен или выключен параметр SET EXACT,
?"ABC">"a"
всегда верно.2. @Jamesits, я думаю, у вас опечатка. ? «ABC» > «a» всегда равно false, независимо от заданной точности.