Я чувствую твою боль. У нас есть столбец в нашей БД, который содержит то, что в компании известно как «номер заказа». Но это не всегда число, в определенных обстоятельствах оно может иметь и других символов, поэтому мы храним его в varchar. В SQL Server 2000 это означает, что выбор по "order_number = 123456" плох. SQL Server эффективно переписывает предикат как "CAST(order_number, INT) = 123456"
, что имеет два нежелательных эффекта:
- индекс включен
order_number
как varchar, поэтому он запускает полное сканирование
- эти нечисловые порядковые номера в конечном итоге приводят к возникновению ошибки преобразования для пользователя с довольно бесполезным сообщением.
В некотором смысле, хорошо, что у нас есть эти нечисловые «числа», поскольку по крайней мере плохо написанные запросы, которые передают параметр в виде числа, попадают в ловушку, а не просто поглощают ресурсы.
Я не думаю, что есть стандарт. Кажется, я помню, что PostgreSQL 8.3 отбросил некоторые приведения по умолчанию между числовым и текстовым типами, чтобы такая ситуация приводила к ошибке при планировании запроса.
Предположительно, "float" считается самым широким числовым типом и, следовательно, тем, к которому все числа могут быть беззвучно повышены?
Да, и аналогичные проблемы (но без ошибок преобразования) для случаев, когда у вас есть столбцы varchar и приложение Java, которое передает все строковые литералы как nvarchar ... внезапно ваши индексы varchar больше не используются, удачи в поиске случаев этого происходит. Конечно, вы можете сказать Java-приложению отправлять строки как varchar, но теперь мы застряли с использованием только символов в windows-1252, потому что это то, для чего БД была создана 5-6 лет назад, когда она была просто «решением для временной остановки». ах-ха.