MySQL сбой в LEFT () с длиной строки 8863 символа? - PullRequest
1 голос
/ 12 марта 2020

Еще одна забавная и необъяснимая проблема с MySQL. Код прекрасно работает со всеми другими более короткими строками (и это было в течение нескольких месяцев), но когда я пытаюсь следовать коду на строке длиной 8863 (предназначенной для простого удаления запятой в качестве последнего символа), он просто ничего не делает. Нет ошибок или чего-то еще. Длина составляет 8863 как до, так и после выполнения (и обратите внимание, что проверка ПРАВА работает нормально, поэтому выполняется СЛЕВА, просто не удаляется последняя запятая). Как уже упоминалось, ТОЛЬКО происходит с очень длинной строкой.

Кто-нибудь знает, с какими безумными ограничениями в MySQL я могу иметь дело?

DECLARE var_sql_insert_1 text;

IF (RIGHT(var_sql_insert_1, 1) = ',') THEN
    SET var_sql_insert_1 = LEFT(var_sql_insert_1, LENGTH(var_sql_insert_1) - 1);
END IF;

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Итак, проблема в том, что я использовал LENGTH, который возвращал длину в байтах против CHAR_LENGTH, который возвращает длину в символах. К сожалению, со всеми другими языками, которые я использовал, значение LENGTH по умолчанию было символьным, а они BYTE_LENGTH были специально разработаны для байтов. Для MySQL кажется, что верно обратное. Не имеет особого смысла для системы, которая в основном используется для хранения и манипулирования ТЕКСТОМ, а не байтовыми данными ...

0 голосов
/ 13 марта 2020

Поскольку MySQl 8, где введена функция REGEXP_REPLACE, вы можете использовать следующее решение:

SET var_sql_insert_1 = REGEXP_REPLACE(var_sql_insert_1, ',$', '');

Шаблон ', $' означает последнюю запятую перед концом строки $

Смотрите пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...