Я испытываю противоречивое поведение на разных машинах с преобразованием в общеизвестный текст (WKT) пространственных типов в SQL Server 2008. Похоже, что данные хранятся одинаково, но преобразование обратно в WKT действует по-разному в зависимости отmachine!
Вот что-то, что я собрал, чтобы точно определить проблему:
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)
17 2011 2011
Авторские права (c) Microsoft Corporation
Developer Edition (64-разрядная версия) в Windows NT 6.1 (сборка 7601: пакет обновления 1)
или
POINT ( -124.957141 39.326679)
0xE6100000010C1EA5129ED0A94340492A53CC413D5FC0
Microsoft SQL Server 2008 R2 (окончательная первоначальная версия) - 10.50.1600.1 (Intel X86) * 10312010 15: 53: 02
Авторские права (c) Microsoft Corporation
Developer Edition для Windows NT 6.0 (сборка 6002: пакет обновления 2) (гипервизор)
Еще один тестовый примерпоказывает, что машина X64 с 2008 R2 (RTM) дает -124.95714099999999 .Итак, определенно указывает x86 против x64.
Я, по крайней мере, немного знаком с отсутствием точности с плавающей запятой, но я не знал, что это специфично для архитектуры.Кажется, что работа с пространственным хранилищем SQL включает в себя данные, проходящие через преобразования WKT, подобные этим.Не вижу ли я более подходящей стратегии для работы с этими данными?