Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Глюк с varbinary
|
|||
|---|---|---|---|
|
#18+
В таблице хранится дерево. В качестве идентификаторов используются uniqueidentifier. Требуется быстро определять путь от корня дерева до любой записи. Для чего используется дополнительное поле varbinary(320), в которое триггером при добавлении новой записи автоматом прописываются сконкатенированные идентификаторы всех родителей до корня дерева (по 16 байт на 1 идентификатор). Далее пытаюсь по нескольким по первым байтам этого поля отфильтровать все записи, которые входят в поддерево, вершина которого задана определенным идентификатором. И тут наступают полные дрова! При применении функции LEFT() к полю varbinary результат преобразуется к VARCHAR(). Это еще как-то понятно. Но то, что происходит дальше, просто не лезет ни в какие ворота. Преобразуется все чего ни попадя ко всему, чего ни попадя. Вообще, обращение к varbinary ломает запросы ко всем чертям даже тогда, когда не должно происходить преобразование типа вообще. Пример: select 'a', BinPath from MyTable - работает нормально. А вот такой запрос: select BinPath, 'a' from MyTable - вместо 'a' выводит полную белиберду (в виде четырех псевдографических символов). select Len(BinPath), BinPath from MyTable - работает нормально select BinPath, Len(BinPath) from MyTable - вместо чисел в некоторых строчках полная белиберда из хаотического нагромождения псевдографики и прочих алфавитных символов (не цифр!), причем такой длины, что число с таким количеством значащих цифр может означать лишь расстояние между галактиками в миллиметрах. Ну а началось все с того, что обнаружил, что длина поля, определяемая функцией Len() после неявного преобразования в varchar и явного обратно в varbinary вдруг почему-то уменьшается на 1. Просто запустил запрос, чтобы убедиться, что преобразование varbinary в varchar и обратно проходит без искажений и является обратимым: select * from MyTable where cast(Left(BinPath, Len(BinPath)) as varbinary(320)) != BinPatch Этот запрос вернул все записи! Оказалось, что в процессе преобразования туда - сюда потерялся один последний байт и у результата выражения длина уменьшилась на 1. Стоит у меня сервиспак на SQL-2000. Может быть, не стОило ставить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2001, 11:21 |
|
||
|
Глюк с varbinary
|
|||
|---|---|---|---|
|
#18+
Попробуйте вместо LEFT использовать SUBSTRING, в отличие от первого второй работает и с бинарными данными. А вообще, если я правильно помню(%90) однозначный перевод между varchar и varbinary невозможен, во что Вы, и наступили ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2001, 12:23 |
|
||
|
|

start [/forum/topic.php?fid=46&gotonew=1&tid=1825833]: |
0ms |
get settings: |
6ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
8ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 334ms |

| 0 / 0 |
