Я наблюдаю непоследовательное поведение на разных машинах при преобразовании пространственных типов в общеизвестный текст (WKT) в SQL Server 2008. Похоже, что данные сохраняются одинаково, но обратное преобразование в WKT действует по-разному в зависимости от машины!
Вот что я собрал, чтобы точно определить проблему:
SET NOCOUNT ON;
DECLARE @TestTable TABLE (TestPoint GEOGRAPHY);
INSERT INTO @TestTable(TestPoint) VALUES (geography::STGeomFromText('POINT(-124.957140999999993 39.326679)',4326));
DECLARE @PointAsText NVARCHAR(max);
SELECT @PointAsText = TestPoint.STAsText() from @TestTable;
PRINT @PointAsText;
DECLARE @PointAsBinary BINARY(22);
SELECT @PointAsBinary = CAST(TestPoint AS BINARY(22)) from @TestTable;
print @PointAsBinary;
print @@version;
На разных машинах, которые у меня есть, я вижу два разных результата:
POINT (-124.95714099999999 39.326679)
0xE6100000010C1EA5129ED0A94340492A53CC413D5FC0
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 54:03
Авторское право (c) Microsoft Corporation
Developer Edition (64-разрядная версия) для Windows NT 6.1 (сборка 7601: пакет обновления 1)
or
POINT (-124.957141 39.326679)
0xE6100000010C1EA5129ED0A94340492A53CC413D5FC0
Microsoft SQL Server 2008 R2 (окончательная первоначальная версия) — 10.50.1600.1 (Intel X86) 1 апр. :53:02
Авторское право (c) Microsoft Corporation
Developer Edition для Windows NT 6.0 (сборка 6002: пакет обновления 2) (гипервизор)
Другой тестовый пример показывает, что машина X64 с 2008 R2 (RTM) дает -124,95714099999999. Итак, определенно указывает на x86 против x64.
Я, по крайней мере, немного знаком с отсутствием точности с плавающей запятой, но я не знал, что это зависит от архитектуры. Кажется, что работа с пространственным хранилищем SQL включает в себя данные, проходящие через подобные преобразования WKT. Я не вижу более подходящей стратегии для работы с этими данными?