|
|
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Требуется приводить строковые значения к числовым, чтобы без ошибок вставлялись в колонки числового типа. Если это невозможно, забивать NULL или 99999. Столкнулся с тем, что в SELECT всё работает, при INSERT выдаётся ошибка. Код: sql 1. Код: sql 1. 99999 Код: sql 1. 2. Error Code: 1264 Out of range value for column 'CAST('1111111' AS DECIMAL(5,0))' at row 1 Код: sql 1. 0 Код: sql 1. 2. Error Code: 1292 Truncated incorrect DECIMAL value: 'a' Если в первом случае ещё можно обойти, добавив LEFT('a', 5), то во втором это, ясное дело, не помогает. Здесь везде конкретные значения только для примера, так берутся значения из текстового поля другой таблицы. Баг связан с параметром sql_mode. У меня "SELECT @@sql_mode" выдаёт STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION Если сделать Код: sql 1. записи вставляет, хотя и выдаёт предупреждения. Но убирать ничего не хочется, если и обходить, то в коде конкретного запроса. Подскажите, может кто-то сталкивался и есть способ обойти? Ну не регулярным выражением же делать конвертацию - совсем тормоза будут. Находил похожие баги, но там несколько другие сценарии и тоже нет воркэраудов: http://bugs.mysql.com/bug.php?id=43437 http://bugs.mysql.com/bug.php?id=76353 Похожее вылазило с STR_TO_DATE(), тоже SELECT нормально показывал, а вставка его же уже не работала, но там получилось через LEFT() обойти. Версия MySQL: 5.5.37, Win7 x64. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 04:15 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Поправка: "Если в первом случае ещё можно обойти, добавив LEFT('1111111', 5)"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 04:20 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
least(MyValue+0, 99999) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 04:55 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Dron007, а почему бы и не регулярным выражением, с чего ты взял, что они такие медленные? ты СУБД программируешь, она на диск пишет, по сравнению с этим многие операции очень быстры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 08:11 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Dron007Баг Знаешь, попытка всунуть в таблицу данные, которые не могут быть помещены в заданный тип - это никак не баг сервера, это баг либо разработчика структуры, либо источника данных для импорта. Dron007Если в первом случае ещё можно обойти Трындец подход... если данные не соответствуют типу поля, засунем туда что-нибудь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 09:01 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
tanglirleast(MyValue+0, 99999) Не работает Код: sql 1. 2. Error Code: 1292 Truncated incorrect DOUBLE value: 'a' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 16:24 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
MasterZivа почему бы и не регулярным выражением, с чего ты взял, что они такие медленные? ты СУБД программируешь, она на диск пишет, по сравнению с этим многие операции очень быстры. На крайний случай придётся ими, но там тысячи записей, не хотелось вносить лишние накладные расходы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 16:25 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
AkinaЗнаешь, попытка всунуть в таблицу данные, которые не могут быть помещены в заданный тип - это никак не баг сервера, это баг либо разработчика структуры, либо источника данных для импорта. Внимательно прочитали написанное? Не похоже. В таблицу как раз пытаюсь вставить уже данные приведенные к нужному типу и SELECT это показывает, так что это именно баг сервера. Dron007Если в первом случае ещё можно обойти Трындец подход... если данные не соответствуют типу поля, засунем туда что-нибудь...[/quot] Вот зачем такую ерунду писать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 16:27 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Dron007Ну не регулярным выражением же делать конвертацию - совсем тормоза будут.В MySQL нет регулярных выражений для модификации строк. Есть только для проверки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 16:35 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Dron007В таблицу как раз пытаюсь вставить уже данные приведенные к нужному типу и SELECT это показывает, так что это именно баг сервера. То есть значение 1111111 ты наивно считаешь приведённым к типу DECIMAL(5,0)? Знаешь, мне жаль тебя огорчать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 16:36 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Dron007Баг связан с параметром sql_mode. У меня "SELECT @@sql_mode" выдаёт STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION Если сделать Код: sql 1. записи вставляет, хотя и выдаёт предупреждения. Но убирать ничего не хочется, если и обходить, то в коде конкретного запроса.Существует не только глобальная, но и сессионная переменная sql_mode. Используйте ее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 16:38 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
miksoftВ MySQL нет регулярных выражений для модификации строк. Есть только для проверки. Да, раньше не возникало надобности, мельком видел, что регэкспы есть, оказалось, есть да не те. А для замены просят уже чуть ли не 10 лет, а их так и не добавили. Но сделал пока так: Код: sql 1. Конечно, скорость от этого не повысится, но более-менее удовлетворительна. miksoftСуществует не только глобальная, но и сессионная переменная sql_mode. Используйте ее. Тоже вариант. Спасибо, подумаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 20:41 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
AkinaТо есть значение 1111111 ты наивно считаешь приведённым к типу DECIMAL(5,0)? Знаешь, мне жаль тебя огорчать... Вообще-то так считают разработчики, раз уж реализовали такое поведение в функции CAST. И меня оно бы вполне устраивало, если бы работало нормально и одинаково как в SELECT, так и в INSERT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 20:46 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Dron007AkinaТо есть значение 1111111 ты наивно считаешь приведённым к типу DECIMAL(5,0)? Знаешь, мне жаль тебя огорчать... Вообще-то так считают разработчики, раз уж реализовали такое поведение в функции CAST. И меня оно бы вполне устраивало, если бы работало нормально и одинаково как в SELECT, так и в INSERT. Вернее, из 1111111 получается 99999, которое и соответствует указанному типу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 20:50 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Dron007Вообще-то так считают разработчики, раз уж реализовали такое поведение в функции CAST. И меня оно бы вполне устраивало, если бы работало нормально и одинаково как в SELECT, так и в INSERT. Включите вывод предупреждений. Повторите запросы из первого поста. Обдумайте результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 20:53 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
AkinaВключите вывод предупреждений. Повторите запросы из первого поста. Обдумайте результат. Ещё раз. Никаких предупреждений не выводится при селектах с указанными CAST. При этом во время INSERT уже идут ошибки. Не считаю такое поведение логичным. Не знаю, может в MySQL есть какие-то свои особенности использования преобразования типов. Обычно если уж преобразование справилось без ошибок и предупреждений, то это значение можно смело использовать где угодно. Может вместо хамовитых назиданий предложите своё решение данной задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 21:37 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Dron007, да ладно вам ругаться.... уменьшим размер ненужной информации...вот что у меня: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. уберите STRICT_TRANS_TABLES, оно вам не надо и все. Наоборот, если надо STRICT_TRANS_TABLES для чего то - будете добавлять в сессии, а для работы это не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2016, 13:08 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Alex_Ustinov, поле у вас INT вставка DECIMAL, попробуйте вставлять соответствующий тип, может этот параметр STRICT_TRANS_TABLES и контролирует соответствие типов. Мне проверять лень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2016, 14:23 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Dron007Никаких предупреждений не выводится при селектах с указанными CAST. Это потому, что у кого-то отключен вывод предупреждений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2016, 17:34 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Alex_Ustinov, Понял. STRICT_TRANS_TABLES выставлен в конфиге my.ini по умолчанию. Не хочется вводить требования к конфигурации и даже менять этот флаг на сессионном уровне, смешивая код и администрирование. Пока оставлю регэкспы, поправил их только слегка, чтобы на любые не-цифры срабатывало. Код: sql 1. Ворнинги выдавались, оказывается, просто SQL клиент (SQLYog) их в отдельной вкладке выводил, никак не сообщая про них. Мне всё-таки кажется крайне странным подобный подход, когда селект и инсерт работают по-разному при одних и тех же настройках. Логичнее по-моему или валиться с ошибкой на селекте уже или позволять и выборку и вставку. А то это как ты записал текст в переменную, проверяешь, всё ок, а хочешь сохранить в файл, пишет, не, не могу. Бред какой-то. Ну да ладно, решение найдено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 19:36 |
|
||
|
Как обойти баг при вставке с конвертацией?
|
|||
|---|---|---|---|
|
#18+
Dron007Мне всё-таки кажется крайне странным подобный подход, когда селект и инсерт работают по-разному при одних и тех же настройках. Да одинаково они работают! В случае SELECT даётся предупреждение, и этого достаточно - в выводе его МОЖНО игнорировать, т.к. вывод данных не влияет на хранимые данные. Но в случае INSERT игнорирование предупреждения невозможно, т.к. есть потенция неверного изменения данных - а посему предупреждение эквивалентно ошибке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2016, 08:58 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=111&tid=1832179]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
53ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 334ms |

| 0 / 0 |
