Почему использование “Y” / “N” вместо небольшого поля в Microsoft SQL Server?

ThreadProc обратный вызов, переданный в CreateRemoteThread, принимает один параметр LPVOID и ThreadProc равен __stdcall.

LPVOID параметр для ThreadProc пересылается из CreateRemoteThread LPVOID lpParameter.

На x86 это означает, что вам нужно поместить инструкцию RET так, чтобы освободить четыре байта из стека.

(Также ThreadProc возвращает DWORD, это означает, что вы должны только вернуть значение в EAX перед возвратом, но если вас не волнует возвращаемое значение, вы можете его пропустить)

Кроме того, CB - это возврат далеко, вам нужно использовать около возврата.

Ищите код операции RETN imm , похоже, что вам нужно C2 04 00

14
задан mdb 2 November 2008 в 08:01
поделиться

12 ответов

Я видел эту практику в более старых схемах базы данных довольно часто. Одно преимущество, которое я видел, состоит в том, что использование полей CHAR (1) оказывает поддержку для больше, чем опций Y/N, как "Да", "Нет", "Возможно".

Другие плакаты упомянули, что Oracle, возможно, использовалась. Схема, которую я упомянул, была на самом деле развернута на Oracle Server и SQL Server. Это ограничило использование типов данных к общему подмножеству, доступному на обеих платформах.

Они действительно отличались в нескольких местах между Oracle Server и SQL Server, но по большей части они использовали общую схему между базами данных для уменьшения технической разработки, должен был поддерживать оба DBS.

18
ответ дан 1 December 2019 в 06:32
поделиться

У меня нет сильных чувств так или иначе. Я не вижу большого преимущества для выполнения его один путь по другому. Я знаю философски, что битовые поля лучше для устройства хранения данных. Моя действительность - то, что у меня есть очень немного баз данных, которые содержат много логических полей в единственной записи. Если бы у меня было много затем, то я определенно хотел бы битовые поля. Если у Вас только есть некоторые, я не думаю, что это имеет значение. Я в настоящее время работаю с Oracle и SQL-сервером DB, и я запустил с базы данных IDMS Cullinet (1980), где мы упаковали все виды данных в записи и волновались о битах и байтах. В то время как я действительно все еще волнуюсь о размере данных, я давно прекратил волноваться о нескольких битах.

0
ответ дан 1 December 2019 в 06:32
поделиться

Иногда такие причуды более связаны с приложением, чем база данных. Например, обработка булевских переменных между PHP и MySQL немного с переменным успехом и делает для неинтуитивного кода. Используя поля CHAR (1) и 'Y' и 'N' делает для намного большего количества удобного в сопровождении кода.

0
ответ дан 1 December 2019 в 06:32
поделиться

Добро пожаловать в существующие производства. Вы наследовали приложение, разработанное старыми школьниками. Это не шаблон разработки (по крайней мере, не шаблон разработки с чем-то хорошее движение для него), это - остаток кодеров, которые получили первый опыт в базах данных с типами ограниченных данных. За исключением рефакторинга DB и большого количества кода, песок Ваши зубы и пищеварительный тракт Ваш путь через него (и часы Ваш случай)!

12
ответ дан 1 December 2019 в 06:32
поделиться

Другие платформы (например, Oracle) не имеют небольшого типа SQL. В этом случае это - выбор между НОМЕРОМ (1) и односимвольным полем. Возможно, они запустили на другой платформе или хотели кросс-платформенную совместимость.

10
ответ дан 1 December 2019 в 06:32
поделиться

Мне не нравится символ Y/N (1) поле как замена к небольшому столбцу также, но существует одна главная оборотная сторона к небольшому полю в таблице: Вы не можете создать индекс некоторое время столбец или включать его в составной индекс (по крайней мере, не в SQL Server 2000).

Несомненно, Вы могли обсудить, если Вам когда-либо будет нужен такой индекс. Посмотрите этот запрос на форуме SQL Server .

2
ответ дан 1 December 2019 в 06:32
поделиться

Я не могу вообразить недостаток в неспособности индексировать столбец "BIT", поскольку это вряд ли имело бы достаточно различных значений для помощи выполнению запроса вообще.

я также предполагаю, что в большинстве случаев различие в устройстве хранения данных между BIT и CHAR (1) незначительно (действительно ли что CHAR является NCHAR? это хранит 16 битов, 24 бита или 32 бита unicode символ? Мы действительно заботимся?)

1
ответ дан 1 December 2019 в 06:32
поделиться

Это ужасно распространено в мейнфреймовых файлах, КОБОЛе, и т.д.

, Если у Вас только есть один такой столбец в таблице, дело не в этом ужасный на практике (никакая реальная трата бита); после того, как весь SQL Server не позволит Вам сказать, что естественное WHERE BooleanColumn, необходимо сказать WHERE BitColumn = 1 и IF @BitFlag = 1 вместо намного более естественного IF @BooleanFlag. Когда у Вас будет несколько разрядных столбцов, SQL Server упакует их. Случай Y/N должен только быть проблемой, если чувствительное к регистру сопоставление используется, и остановить недопустимые данные, всегда существует опция ограничения.

сказавший все это, мое персональное предпочтение для битов и только разрешения NULL с после внимательного рассмотрения.

, По-видимому, разрядные столбцы не являются хорошей идеей в MySQL .

1
ответ дан 1 December 2019 в 06:32
поделиться

Причины следующим образом (btw, они не серьезные основания):

1) Y/N может быстро стать "X" (для неизвестного), "L" (для вероятного), и т.д. - под чем я подразумеваю, это - то, что я лично работал с программистами, которые так привыкли к не собирающимся требованиям правильно, чтобы они только что запустили с Y/N как вид 'флагов' с суеверием, которое он, возможно, должен был бы развернуть (к которому они должны использовать интервал в качестве состояния ID).

2) "Производительность" - но как был упомянут выше, индексы SQL исключены, если они не будут достаточно 'выборочными'... поле, которое только имеет 2 возможных значения, то никогда не будет использовать тот индекс.

3) Ленивость. - Иногда разработчики хотят произвести непосредственно к некоторому визуальному представлению с буквой "Y" или "N" для человеческой читаемости, и они не хотят преобразовывать его сами :)

существуют все 3 плохих причины, что я слышал/видел прежде.

1
ответ дан 1 December 2019 в 06:32
поделиться

Я видел хуже...

Один картопостроитель O/R у меня был случай для работы с используемым, 'верным' и 'ложным', поскольку они могли быть чисто брошены в булевские переменные Java.

кроме того, На базе данных создания отчетов, такой как хранилище данных, DB является пользовательским интерфейсом (основанные на метаданных инструменты создания отчетов, несмотря на это). Вы могли бы хотеть сделать этот вид вещи как помощь людям, разрабатывающим отчеты. Кроме того, индекс с двумя значениями все еще привыкнет индексными перекрестными операциями на схеме "звезда".

0
ответ дан 1 December 2019 в 06:32
поделиться

Они, возможно, запустили разработку назад с Microsoft SQl 6.5

Тогда, добавив, что немного поля к существующей таблице с данными на месте было королевской болью сзади. Битовые поля не могли быть пустыми, таким образом, единственный способ добавить тот к существующей таблице состоял в том, чтобы составить временную таблицу со всеми существующими полями целевой таблицы плюс битовое поле и затем скопировать данные, заполнив битовое поле со значением по умолчанию. Затем необходимо было удалить исходную таблицу и переименовать временную таблицу к настоящему имени. Добавьте некоторые внешние ключевые отношения, и у Вас есть длинный сценарий для записи.

Однако всегда были сторонние инструменты для помощи с процессом. Если предыдущий разработчик принял решение использовать символьные поля вместо битовых полей, причиной, короче говоря была, вероятно, лень.

1
ответ дан 1 December 2019 в 06:32
поделиться

Они, вероятно, привыкли использовать Oracle и правильно не читали на доступных типах данных для SQL Server. Я нахожусь в точно, что ситуация сам (и поле Y/N сводит меня с ума).

0
ответ дан 1 December 2019 в 06:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: