|
|
|
|
#1 |
|
MCTS
|
У меня ax3 sp5 kr3 Oracle 10g
Оба селекта работаю одинаково. Думал, может вы точку (англ/рус) перепутали. Попробовал сделать так. Но даже с разными знаками вывод идет в одинаковом порядке. |
|
|
|
|
#2 |
|
MCITP
|
Цитата:
![]() С Ораклом ситуация чуть другая, у вас наверняка ж стоит на БД NLS_COMP в значении "BINARY" (ну либо пустое, по умолчанию = BINARY). Это значит, что все сравнения и сортировки будут бинарные, по коду символов в кодировке. Насколько я понимаю, именно так сортируются и временные таблицы в ОС Аксаптой. Хотя теоретически это тоже может зависеть от кодировки, которую использует БД. Если вы найдёте такую кодировку, где символ "-" имеет код больше чем ".", и используете её в БД, то будет тот же эффект... (обычно код "-"= 45, код "."= 46) 2 Perc: посмотрите на сервере БД какие коды у этих символов и какие у вас кодировки и колэйшыны стоят - в студию. PS В случае же когда на сервере БД используется "лингвистическая" сортировка, там вообще может быть всё что угодно, в этом я не силён.
__________________
Zhirenkov Vitaly |
|
|
|
|
#3 |
|
Участник
|
Цитата:
Как правильно смотреть коды символов на сервере БД не знаю, но запрос: select field1, ASCII(SUBSTRING(field1, 1, 1)), ASCII(SUBSTRING(field1, 2, 1)), UNICODE(SUBSTRING(field1, 1, 1)), UNICODE(SUBSTRING(field1, 2, 1)) from table1 order by field1 asc дает результат: .б 46 225 46 1073 -а 45 224 45 1072 |
|
|
|
|
#4 |
|
Участник
|
Цитата:
PHP код:
Если сравниваемые символы - это не буквы и не цифры, то результат заранее предсказать сложно. Если есть возможность, то лучше синхронизировать коды не сравнивая по принципу "больше/меньше", а сравнивая по принципу "не равно". Например, у нас Ax2.5SP3 и MS SQL 2005 Collation SQL_Latin1_General_CP1251_CI_AS. При такой сортировке, символ дефиса (тире) оказывается меньше любого другого символа. Даже меньше пустой строки (!) Поэтому, если в Axapta написать запрос вида X++: select MyTab where MyTab.MyField X++: select * from MyTab where MyTab.MyField > '' А вот если написать X++: select MyTab where MyTab.MyField != "" X++: select * from MyTab where MyTab.MyField <> '' Другой вариант - это делать выборку на сервере, а потом перегонять ее во временную таблицу на клиенте для корректной сортировки. |
|
|
|
| За это сообщение автора поблагодарили: Logger (5), tricky (1). | |
|
|
#5 |
|
Участник
|
Цитата:
Опасный баг. Это же может вылезти в куче мест. Все таки странно каким чудом дефис оказался меньше пустой строки. По логике не должно так быть. Это скорее всего бага в БД. Интересно а что будет, если в коде Аксапты вместо X++: select MyTab where MyTab.MyField X++: select MyTab where MyTab.MyField>'-' |
|
|
|
|
#6 |
|
Участник
|
Пробовали, конечно. В последнем сообщении приведен тестовый пример, как можно посмотреть при каком Collation какой порядок сортировки будет. Например, при Cyrillic_General_CI_AS все "как положено". Пустое значение и пробел считаются самыми маленьким символами.
Бросается в глаза именно положение пустого значения и пробела, которые оказываются больше ряда символов (одиночный апостроф, дефис, длинные тире и др.). Ну, это вряд ли. Типичная ситуация, когда это вылезает - это сравнение на пустоту. Мало кому в голову приходит сравнивать символьные строки на больше/меньше. Более того, должно быть не просто сравнение на пустоту, но и содержимое поля должно начинаться с символа дефиса. Достаточно редкая ситуация Собственно, именно поэтому и не поменяли Collation на сервере. Просто не возникает проблемных ситуаций по данной причине. А там, где это надо учитывать (ну в очень специфических ситуациях) делаем специальный обход. Цитата:
Так понятно, что будет. Если пустое значение больше, чем дефис, то в выборку попадут все поля с пустым значением поля Последний раз редактировалось Владимир Максимов; 25.08.2010 в 19:58. |
|
|
|
|
#7 |
|
Участник
|
Спасибо за информацию.
Цитата:
X++: select MyTab where MyTab.MyField И кстати, я считаю что для условия на пустоту/непустоту строкого поля правильнее писать X++: select MyTab where MyTab.MyField X++: select MyTab where MyTab.MyField != '' |
|
|
| Теги |
| collation, sql server, баг, сортировка, сравнение |
|
|
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|