0 / 0 / 0
Регистрация: 04.12.2018
Сообщений: 5
|
|
1 | |
MySQL Ошибка сортировки в Delphi 64bit поля Decimal04.12.2018, 19:37. Показов 1064. Ответов 9
Метки нет (Все метки)
Всем привет! Спецы Delphi и MySQL нужна ваша помощь)
Имеется: Delphi XE8 + dbExpress + старенький сервер Mysql v5.0.45 win32 + база MyISAM и в таблице поле DECIMAL(5,2) со знаком. Таблица храниться как: Charset cp1251 Collation: cp1251_general_ci В Delphi использую TSQLConnection + TDataSource + TSimpleDataSet TSQLConnection в параметрах прописал ServerCharSet cp1251 Из таблицы делается простой Select и сортировка по полю DECIMAL. Пока программа компилировалась как 32-разрядная, все работало. Однако пришлось переделать ее под 64 бита и сразу же вылезла неприятная ошибка - перестала работать сортировка по этому полю. Если программу снова пересобрать под 32 - сортировка работает. То есть ошибка только в 64 разрядной программе. Опытным путем было установлено, что положительные числа сортирует правильно: 2.25 2.5 2.75 Однако числа со знаком отказываются сортироваться -0.25 0.25 -0.5 0.5 и тд Тип DECIMAL(5,2) выбрал потому, что очень важна точность. Число 2.75 так и должно храниться в базе и не искажаться. На данный момет я не понимаю, где случается засада. Тип DECIMAL(5,2) хранится как строка, переведя программу под 64 разряда я изменил ее представление в программе, но не ясно где проблема: - TSQLConnection + TDataSource + TSimpleDataSet? - проблема во взаимодействии клиента с сервером, кодировки, правила сравнения для кодировки? Можно все порешать переведя поле во FLOAT, но я переживаю из-за потери точности, хотелось бы решить проблему с сортировкой DECIMAL
0
|
04.12.2018, 19:37 | |
Ответы с готовыми решениями:
9
Ошибка Cannot convert from 'ref decimal' to 'ref decimal? Хранимая процедура сортировки числового поля для сортировки по алфавиту Валидация поля decimal на стороне клиента без влияния региональных настроек Не работает запрос с одинаковыми типами данных c# decimal, SQL Server Decimal(18,2) |
0 / 0 / 0
Регистрация: 04.12.2018
Сообщений: 5
|
|
04.12.2018, 21:12 [ТС] | 3 |
Сорри, самое главное забыл)
Да, запрос совсем простой: select * table order by field field - DECIMAL(5,2) со знаком В 32-ух разрядной программе все работало, в 64 разрядной выдает такое: 0 -0.25 0.25 -0.5 -0.75 -1 То есть перестает знак учитывать. Я больше склоняюсь к ошибке при взаимодействии клиента и сервера, только не ясно куда копать.
0
|
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,566
|
|
04.12.2018, 22:11 | 4 |
0
|
0 / 0 / 0
Регистрация: 04.12.2018
Сообщений: 5
|
|
04.12.2018, 22:29 [ТС] | 5 |
Заюзал MySQL Query Browser, запрос отработал корректно. Но этот MySQL Query Browser 32-ух разрядный. Если я свою прогу сейчас перекомпилю в 32-разряда - она тоже снова заработает. Через какую 64-ех разрядную программу протестить можно? Или все таки переехать на MySQL версии 5.1 64-разрядную и там будут утилиты тоже 64 бит?
0
|
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,566
|
|
04.12.2018, 22:39 | 6 |
Проверять надо из 64 битного ПК - из mysql workbench 64-ух разрядный. https://www.mysql.com/products/workbench/
0
|
0 / 0 / 0
Регистрация: 04.12.2018
Сообщений: 5
|
|
04.12.2018, 22:42 [ТС] | 7 |
ПК 64 битный, MySQL Query Browser 64-ух разрядный попрубую поискать, спасибо за наводку
Стоит ли делать такое? 1. Проапгрейдить мускул до mysql-essential-5.1.72-winx64.msi Сервер будет тоже 64 бит, как и моя программа 2. Переконвертировать всю базу в utf-8. Думаю сделать через dump, руками поменять кодирувку и collation и снова залить 3. Все взаимодействие клиент-сервер перевести на utf-8 character_set_client - utf8 character_set_connection - utf8 character_set_database - utf8 character_set_results - utf8 character_set_server - utf8 character_set_system - utf8 collation_connection - utf8_general_ci collation_database - utf8_general_ci collation_server - utf8_general_ci
0
|
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,566
|
|
04.12.2018, 22:48 | 8 |
Через MySQL Workbench 8.0.13 проверяй https://dev.mysql.com/downloads/workbench/ кодировка лучше на utf8 да
Добавлено через 1 минуту и ещё лучше если будите подключить через MyDAC
0
|
0 / 0 / 0
Регистрация: 04.12.2018
Сообщений: 5
|
|
05.12.2018, 13:10 [ТС] | 10 |
MySQL Workbench 8.0.13 с моим сервером работать отказался, поставил MySQL Workbench 6.2 64bits, он при старте ругается, что нужен мускул хотя бы 5.1, но запускается. Запрос отработал корректно. То есть дело в программе.
В Delphi обнаружил FireDAC, кинул на форму FDConnection + FDQuery и запрос тоже работает, то есть дело в dbExpress. Выбросил TSimpleDataSet, взял просто TSQLQuery и он тоже отработал норм. Проблема локализовалась в TSimpleDataSet. Он кеширует данные в памяти, создает двунаправленный курсор. Когда я перевел прогу под 64 бита, он стал как то по другому кешировать данные и вот вылезла проблема. qwertehok, похоже действительно в этом проблема. Потому что вот еще из справки, но уже для мускула 5.5: У меня сервер старый 5.0, а Delphi и dbExpress относительно новые Delphi XE8 + Dbxmys.dll 22.0.19908.869 Видимо драйвер dbExpress слишком новый и не понимает старый мускул. Может можно нарыть где в инете старый Dbxmys.dll, который был под сервер 5.1 написан и пока его заюзать? А потом уже не спеша проапгрейдить мускул до 5 версий Добавлено через 7 минут Проапгрейдить мускул до 5.5 версии
0
|
05.12.2018, 13:10 | |
05.12.2018, 13:10 | |
Помогаю со студенческими работами здесь
10
Delphi ошибка синтаксиса при определение поля Настройка IPv6 (Debian 7 64bit/CentOS 6 64bit) на VPS OpenGL и невидимый Bitmap: не всякая поверхность строится под Delphi XE2 64bit Condition Zero 1.2 на Win7 64bit. Ошибка file read failure Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |