MySQLi выбирает все, где что-то находится в значении строки таблицы [duplicate]

Это решение также решает как сетевую ошибку, так и службу за сервером sql

. Я ответил на аналогичный вопрос здесь, вам нужно указать другой open Run type-> services.msc - под услугами -> sort by stopped, который вы увидите куча остановленных служб SQL Right click and start

Чтобы начать - есть 4 проблемы, которые могут вызвать ошибки common LocalDb SqlExpress Sql Server [41], прежде чем вы начнете необходимо переименовать v11 или v12 в (localdb) \ mssqllocaldb

Я обнаружил, что самый простой должен сделать следующее: я приложил pics и шаги для помощи.

Сначала проверьте, какой экземпляр вы установили, вы можете сделать это, проверив реестр и , выполнив команду cmd

  1. cmd> Sqllocaldb.exe i
  2. cmd> Sqllocaldb.exe s "whicheverVersionYouWantFromListBefore", если этот шаг завершился неудачно, вы можете удалить с помощью опции d cmd> Sqllocaldb .exe d "someDb"
  3. cmd> Sqllocaldb.exe c "createSomeNewDbIfyouWantDb"
  4. cmd> Sqllocaldb.exe start "createSomeNewDbIfyouWantDb"

301
задан Mad Scientist 22 March 2017 в 12:02
поделиться

9 ответов

В дополнение к нарушению первой нормальной формы из-за повторяющейся группы значений, хранящихся в одном столбце, в списках, разделенных запятыми, есть много других более практических проблем:

  • Невозможно гарантировать, что каждое значение является правильным типом данных: невозможно предотвратить 1,2,3, banana, 5
  • Невозможно использовать ограничения внешнего ключа привязать значения к таблице поиска; нет возможности обеспечить ссылочную целостность.
  • Невозможно обеспечить уникальность: невозможно предотвратить 1,2,3,3,3,5
  • Can 't удалить значение из списка, не извлекая весь список.
  • Не удается сохранить список дольше, чем в столбце строки.
  • Трудно найти все объекты с заданное значение в списке; вы должны использовать неэффективное сканирование таблицы. Возможно, придется прибегать к регулярным выражениям, например, в MySQL: idlist REGEXP '[[:<:]]2[[:>:]]' *
  • Жестко подсчитывать элементы в списке или выполнять другие агрегированные запросы.
  • Трудно присоединиться к значениям к справочной таблице, к которой они ссылаются.
  • Жесткий выбор списка в отсортированном порядке.
  • Сохранение целых чисел в виде строк занимает в два раза больше места, чем сохранение двоичных целых чисел. Не говоря уже о пространстве, взятом запятыми.

Чтобы решить эти проблемы, вам нужно написать тонны кода приложения, заново изобрести функциональные возможности, которые СУБД уже обеспечивает гораздо более эффективно .

Списки, разделенные запятыми, настолько ошибочны, что я сделал это первой главой в моей книге: SQL Antipatterns: избегайте ошибок программирования баз данных .

Бывают случаи, когда вам нужно использовать денормализацию, но, поскольку @OMG Ponies упоминает , это исключения. Любая нереляционная «оптимизация» выгодна для одного типа запросов за счет других видов использования данных, поэтому убедитесь, что знаете, какие из ваших запросов нужно обрабатывать так специально, что они заслуживают денормализации.


* MySQL 8.0 больше не поддерживает этот синтаксис выражения слова-границы.

480
ответ дан Bill Karwin 19 August 2018 в 08:08
поделиться
  • 1
    Спасибо за подробный список, я подумал о некоторых из этих проблем, но, конечно, не всех. – Mad Scientist 6 September 2010 в 19:35
  • 2
    Книга выглядит интересной, поэтому я ее купил. Я давно думал, что это предмет, который нуждается в книге. – HLGEM 7 September 2010 в 15:01
  • 3
    ARRAY (любого типа данных) может исправить исключение, просто проверьте PostgreSQL: postgresql.org/docs/current/static/arrays.html (@Bill: Великая книга, обязательная для любого разработчика или дБА) – Frank Heikens 24 November 2011 в 23:18
  • 4
    +1 законопроект Карвин Великий ответ! Прекрасные краткие пункты. Это похоже на отличную книгу. Любите обложку слишком +1 NullUserException. Я в процессе разработки схемы для базы данных MySQL, чтобы заменить плоскую файловую систему на основе текста. До сих пор я сталкивался с несколькими дилеммами. Так что эта книга будет стоить покупать. – therobyouknow 30 January 2012 в 18:16
  • 5
    Не следует ли банану приходить до 3, а не после? – Jay 19 February 2015 в 22:31

В общем, все может быть оправданным, если оно соответствует требованиям вашего проекта. Это не означает, что люди согласятся или хотят защитить ваше решение ...

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

15
ответ дан bobbymcr 19 August 2018 в 08:08
поделиться

«Одной из причин была лень».

Это звонит колокола. Единственная причина, по которой вы должны сделать что-то подобное, - это то, что вы знаете, как это сделать «правильно», но вы пришли к выводу, что есть осязаемая причина не делать этого таким образом.

сказал: если данные, которые вы предпочитаете хранить таким образом, - это данные, которые вам никогда не потребуется запрашивать, тогда может быть случай для его хранения в том виде, в котором вы выбрали.

(Некоторые пользователи будет оспаривать заявление в моем предыдущем абзаце, в котором говорится, что «вы никогда не сможете узнать, какие требования будут добавлены в будущем». Эти пользователи либо ошибочны, либо заявляют о религиозной убежденности. Иногда бывает полезно работать с требованиями, которые у вас есть перед вами .)

34
ответ дан cHao 19 August 2018 в 08:08
поделиться
  • 1
    Я всегда слышу, как некоторые люди говорят, что «мой дизайн более гибкий, чем ваш». когда я сталкиваюсь с ними о таких вещах, как не задание ограничений внешнего ключа или хранение списков в одном поле. Для меня гибкость (в таких случаях) == нет дисциплины == лени. – foresightyj 30 January 2015 в 04:28

Мне нужен столбец с несколькими значениями, он может быть реализован как поле xml

. Он может быть преобразован в запятую, если это необходимо

, запрашивающий список XML в sql-сервере, используя Xquery .

Будучи полем xml, некоторые проблемы могут быть устранены.

С CSV: не может гарантировать, что каждое значение является правильный тип данных: нет возможности предотвратить 1,2,3, банан, 5

С XML: значения в теге могут быть принудительно заданы для типа


С CSV: не удается использовать ограничения внешнего ключа для привязки значений к таблице поиска;

С XML: все еще проблема


С CSV: не может обеспечить уникальность: никакой возможности предотвратить 1,2,3,3 , 3,5

С XML: все еще проблема


С CSV: невозможно удалить значение из списка, не извлекая весь список.

С XML: отдельные элементы могут быть удалены


С CSV: трудно найти все объекты с заданным значением в списке; вам нужно использовать неэффективное сканирование таблицы.

С XML: поле xml можно индексировать


С CSV: трудно подсчитать элементы в списке или сделать другой агрегат запросы. **

С XML: не особо сложно


С CSV: трудно присоединить значения к справочной таблице, к которой они ссылаются. **

С XML: не особенно сложно


С CSV: трудно получить список в отсортированном порядке.

С XML: не особо сложно


С CSV: сохранение целых чисел в виде строк занимает в два раза больше места, чем сохранение двоичных целых чисел.

С XML: память еще хуже, чем csv


С CSV: Плюс много запятых.

С использованием XML: теги используются вместо запятых


Короче говоря, использование XML затрагивает некоторые проблемы с ограниченным списком И может быть при необходимости преобразуется в список с разделителями

7
ответ дан Community 19 August 2018 в 08:08
поделиться

Да, я бы сказал, что это действительно так плохо.

Он прерывает первую нормальную форму.

Вторая критика заключается в том, что ввод исходных результатов непосредственно в базу данных, без какой-либо проверки или привязки вообще, дает вам возможность открывать атаки SQL-инъекций.

То, что вы называете лень и отсутствие знаний SQL, - это материал, из которого сделаны неофиты. Я рекомендую потратить время, чтобы сделать это правильно, и рассмотреть его как возможность узнать.

Или оставьте это как есть и узнайте болезненный урок атаки SQL-инъекции.

11
ответ дан duffymo 19 August 2018 в 08:08
поделиться
  • 1
    Я ничего не вижу в этом вопросе, который предполагает, что он уязвим для SQL-инъекции. SQL-инъекция и нормализация базы данных являются ортогональными темами, и ваше отступление от инъекции не имеет отношения к вопросу. – Hammerite 6 September 2010 в 19:24
  • 2
    @Paul: И, может быть, такое же отношение приведет к тому, что его ударит автобус, когда он не сможет смотреть в обоих направлениях, прежде чем пересекать улицу, но вы не предупредили его об этом. Редактировать: Я думал, что вы плакат этого ответа, моя ошибка. – Hammerite 6 September 2010 в 19:29
  • 3
    @Hammerite - ваша экстраполяция на автобусы смехотворна. – duffymo 6 September 2010 в 20:06
  • 4
    Да, это было смешно. Его смехотворность иллюстрирует то, что я делаю, а это то, что нет смысла предупреждать его о том, что у вас нет причин думать, что его нужно предупреждать. – Hammerite 6 September 2010 в 22:21
  • 5
    Да я вижу. Я думаю, что у меня было гораздо больше оснований, что вы предупреждали насчет автобусов. – duffymo 6 September 2010 в 22:24

Я бы, вероятно, занял среднюю позицию: сделайте каждое поле в CSV отдельным столбцом в базе данных, но не беспокойтесь о нормализации (по крайней мере пока). В какой-то момент нормализация могла бы стать интересной, но со всеми данными, забитыми в один столбец, вы практически не получаете никакой пользы от использования базы данных вообще. Вам необходимо разделить данные на логические поля / столбцы / все, что вы хотите вызвать, прежде чем вы сможете манипулировать им.

0
ответ дан Jerry Coffin 19 August 2018 в 08:08
поделиться
  • 1
    Форма содержит еще несколько полей, это только одна часть формы (что я не очень хорошо объяснил в вопросе). – Mad Scientist 6 September 2010 в 19:29

Есть множество вопросов по SO, которые спрашивают:

  • как получить счет конкретных значений из списка, разделенного запятыми
  • , как получить записи, имеющие только одно и то же 2/3 / etc из этого списка с разделителями-запятыми

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

Это все симптомы денормализованных данных и подчеркивают, почему вы всегда должны моделировать нормализованные данные. Денормализация может быть оптимизацией запроса, , которая будет применяться, когда сама на самом деле представится .

36
ответ дан OMG Ponies 19 August 2018 в 08:08
поделиться

Ну, я уже более 4 лет использую список разделов вкладки с ключом / значением в столбце NTEXT в SQL Server и работает. Вы теряете гибкость при создании запросов, но, с другой стороны, если у вас есть библиотека, которая сохраняет / держирует пару ключевых значений, это не такая плохая идея.

5
ответ дан Raj 19 August 2018 в 08:08
поделиться
  • 1
    Нет, это ужасная идея. Вам удалось уйти от него, но стоимость ваших нескольких минут разработки обойдется вам в ущерб производительности запросов, гибкости и ремонтопригодности вашего кода. – Paul Tomblin 6 September 2010 в 19:28
  • 2
    Пол, я согласен. Но, как я сказал, я использовал, если для определенной цели, и это для операции ввода данных, где у вас есть много видов форм. Я сейчас пересматриваю дизайн, когда узнал NHibernate, но тогда мне понадобилось гибкое решение для разработки формы в ASP.NET и использование идентификаторов текстовых полей в качестве ключа в паре ключ / значение. – Raj 7 September 2010 в 07:58
  • 3
    +1, чтобы противостоять нисходящим линиям. Говорить кому-то, кто поддерживал приложение в течение 4 лет по вопросам обслуживания, немного самонадеянно. Очень мало "ужасных" идеи в развитии - в основном это просто идеи с очень ограниченной применимостью. Разумно предупредить людей об ограничениях, но наказывать тех, кто сделал это и пережил это, поражает меня как святое, чем ты отношение, с которым я могу обойтись. – Mark Brackett 9 July 2013 в 23:55

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

6
ответ дан Robin 19 August 2018 в 08:08
поделиться
Другие вопросы по тегам:

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