УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

[BugFixed] Переполнение строки при записи в БД MySQL


Автор Сообщение
Сообщение создано: 19. 11. 2008 [15:01]
Expert
Владимир Тихонов
Создатель темы
Зарегистрирован(а) с: 05.08.2008
Сообщения: 45
В случае если создать любой параметр с длинной строкой ID например emul_klap_nagnet_suspenz1, то при сохранение в БД MySQL он его режет примерно до такого вида:
emul_klap_nagnet_sus
что приводит к ошибке при сохранении в БД в случае если есть еще такой же параметр например emul_klap_nagnet_suspenz2, который отличен от предыдущего но при сохранении так же режется и принимает такой же вид (emul_klap_nagnet_sus). По этой причине emul_klap_nagnet_suspenz2 и остальные не сохраняются.
вот лог ошибки которая была видна в терминале:
3|/WorkStation/sub_BD/mod_MySQL/db_Test/ | Ошибка 1 запроса к БД: Duplicate en
try 'emul_klap_nagnet_sus-out' for key 1

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


[Сообщение редактировалось 1 раз(а), в последний раз 19.11.2008 в 15:03.]

Все глюки Windows исправляются установкой Linux
Сообщение создано: 19. 11. 2008 [18:33]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
Как его исправишь? Ключ бесконечной длины быть всёравно не может. Ограничивайте идентификаторы.

Learn, learn and learn better than work, work and work.
Сообщение создано: 19. 11. 2008 [21:54]
Expert
Владимир Тихонов
Создатель темы
Зарегистрирован(а) с: 05.08.2008
Сообщения: 45
roman wrote:

Как его исправишь? Ключ бесконечной длины быть всёравно не может. Ограничивайте идентификаторы.

ясно, понял, не дурак. Просто хотел спросить у ВАС как у РАЗРАБОТЧИКА ибо не имею таких познаний!!! Имел бы, сделал бы наверное свою скаду)))) Спасибо за столь скорый и внятный ответ! В принципе уже нашли выход писать не длинные ИД, хотя было бы неплохо иметь кое где и длинные!

Все глюки Windows исправляются установкой Linux
Сообщение создано: 20. 11. 2008 [07:31]
almaz
Almaz Karimov
Contributor
Зарегистрирован(а) с: 25.09.2008
Сообщения: 516
Нормально было бы увеличить длину строки раза в 3. А также предупреждать пользователя в UI при введении слишком длинного Id или обрезать сразу при вводе строки пользователем.
Появление данной ошибки (по неосторожности может произойти с любым пользователем) приводит в краху (глюкам) БД MySQL всего проекта.
Пользователь, который работает в GUI и не заглядывает в командную строку, продолжает работать не замечая этой ошибки.

[Сообщение редактировалось 3 раз(а), в последний раз 20.11.2008 в 07:59.]

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Сообщение создано: 20. 11. 2008 [09:19]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
Увеличить можно. А вот с контроллем есть проблемы. Проблемы связаны с тем, что разные БД по разному хранят тот-же UTF, кроме того при привышении общей длины ключа таблицы, могут принудительно длины всех ключевых полей уменьшаться.
Следовательно я незнаю реального ограничения длины поля БД, особенно для кирилицы на UTF.

Принимаю предложения, в каких местах хотелось-бы иметь идентификаторы побольше?

Learn, learn and learn better than work, work and work.
Сообщение создано: 20. 11. 2008 [15:11]
almaz
Almaz Karimov
Contributor
Зарегистрирован(а) с: 25.09.2008
Сообщения: 516
Речь идет обо всех идентификаторах OpenSCADA, но реально столкнулись на логическом уровне и в блочном вычислителе (здесь дерево проекта разрастается наиболее интенсивно).

64 символа (128 байт в UTF) я думаю было бы достаточно чтобы задать любые идентификаторы. По умолчанию MySQL рассматривает 1120 байтов ключа.
Вопрос: другие БД поддержат 64 символа?

Еще вопрос: при увеличении длины быстродействие БД пострадает только у пользователей, использующих длинные идентификаторы или у всех?

Еще вопрос: есть ли возможность жестко ограничить кол-во символов (допустим 63) в виджете OpenSCADA, в котором вводятся идентификаторы объектов?

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Сообщение создано: 21. 11. 2008 [11:54]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
almaz wrote:

Речь идет обо всех идентификаторах OpenSCADA, но реально столкнулись на логическом уровне и в блочном вычислителе (здесь дерево проекта разрастается наиболее интенсивно).

64 символа (128 байт в UTF) я думаю было бы достаточно чтобы задать любые идентификаторы. По умолчанию MySQL рассматривает 1120 байтов ключа.
Вопрос: другие БД поддержат 64 символа?

Поддерживают
almaz wrote:

Еще вопрос: при увеличении длины быстродействие БД пострадает только у пользователей, использующих длинные идентификаторы или у всех?

Скорее всего только при больших идентификаторах. А вот размер БД точно увеличится ибо многие под тип данных char[120] зарезервируют все 120 символов.
almaz wrote:

Еще вопрос: есть ли возможность жестко ограничить кол-во символов (допустим 63) в виджете OpenSCADA, в котором вводятся идентификаторы объектов?

Ограничить можно.
Ещё одна неприятная особенность. Если я все идентификаторы сделаю размером 63, то скажем ранее созданные файловые архивы значений потеряются. Ибо внутри них, в жесткой структуре, зарезервировано 20 символов на идентификатор архива. Который, кстати, формируется из идентификатора параметра и атрибута. А если каждый из них по 63, то это уже получится 126!

Learn, learn and learn better than work, work and work.
Сообщение создано: 21. 11. 2008 [20:15]
almaz
Almaz Karimov
Contributor
Зарегистрирован(а) с: 25.09.2008
Сообщения: 516
Тогда лучше оставить как есть 20 символов, а для детального описания параметров есть поля Name и Description.
Единственная просьба: сделать жесткое ограничение в 20 символов в поле ввода идентификатора нового объекта, т.е чтобы пользователь не смог вбить более 20 символов идентификатора.
Данное ограничение поможет избежать неприятностей при работе над проектами.

Еще вопрос: ограничение в 20 символов для идентификатора действует по всей OpenSCADA или эта цифра разная в различных модулях?

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Сообщение создано: 22. 11. 2008 [20:38]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
almaz wrote:

Тогда лучше оставить как есть 20 символов, а для детального описания параметров есть поля Name и Description.
Единственная просьба: сделать жесткое ограничение в 20 символов в поле ввода идентификатора нового объекта, т.е чтобы пользователь не смог вбить более 20 символов идентификатора.
Данное ограничение поможет избежать неприятностей при работе над проектами.

OK
almaz wrote:

Еще вопрос: ограничение в 20 символов для идентификатора действует по всей OpenSCADA или эта цифра разная в различных модулях?

Это значение размера ключевого поля "ID" таблиц БД. У каждой таблицы это значение может быть собственное. Вот только разные значения размера поля "ID" нужно будет научить конфигуратор и другие UI воспринимать.

Learn, learn and learn better than work, work and work.
Сообщение создано: 24. 11. 2008 [18:35]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
В первом приближении ограничение ввода идентификатора сделал.
А вообще это отдельная работа, которая заключается в проверке границ всех переменных доступных пользователю.
Если найдутся ещё проблемами с границами - сообщайте. Будем поэтапно, помере проявления, фиксить.

Learn, learn and learn better than work, work and work.



22641