Задавайте вопросы, мы ответим
Вы не зашли.
Привет всем! Вы когда-нибудь сталкивались с подобной проблемой (?):
[1] Имеется следующая тестовая таблица:
mysql> describe whitespace_table;
Отредактированно FiMko (03.03.2012 20:56:55)
Неактивен
Из созвучного, найденного в официальной документации:
http://dev.mysql.com/doc/refman/5.0/en/char.html написал:
For VARCHAR columns, trailing spaces in excess of the column length are truncated prior to insertion and a warning is generated, regardless of the SQL mode in use. For CHAR columns, truncation of excess trailing spaces from inserted values is performed silently regardless of the SQL mode.
VARCHAR values are not padded when they are stored. Handling of trailing spaces is version-dependent. As of MySQL 5.0.3, trailing spaces are retained when values are stored and retrieved, in conformance with standard SQL. Before MySQL 5.0.3, trailing spaces are removed from values when they are stored into a VARCHAR column; this means that the spaces also are absent from retrieved values.
Я сменил тип колонки на VARCHAR, чтобы проверить возможные предупреждения, но никаких предупреждений об усечении при вставке строки я не получил. Да собственно и почему, я же не превышаю длину поля (trailing spaces in excess of the column length are truncated). Также и в phpMyAdmin в режиме редактирования данных я вижу свой пробел в таблице.
Добавил в хранимую процедуру дополнительные проверки:
Отредактированно FiMko (03.03.2012 19:13:02)
Неактивен
Нашел что-то похожее в буржунете:
http://dba.stackexchange.com/questions/6664/mysql-how-do-you-enter-a-record-with-only-whitespace написал:
Whitespace is ignored when doing comparisions. Meaning where col="abc" will match both "abc" and "abc ".
И действительно:
Отредактированно FiMko (03.03.2012 18:51:15)
Неактивен
Прикольно, добился рабочего варианта. Все-таки заработало именно после смены типа для переменной whitespace в процедуре, а также для поля whitespace_column в таблице с CHAR на VARCHAR. Для типа CHAR так и не работало. Подозреваю, это все же из-за этого:
http://dev.mysql.com/doc/refman/5.5/en/char.html написал:
The CHAR and VARCHAR types are similar, but differ in the way they are stored and retrieved. They also differ in maximum length and in whether trailing spaces are retained.
When CHAR values are stored, they are right-padded with spaces to the specified length. When CHAR values are retrieved, trailing spaces are removed unless the PAD_CHAR_TO_FULL_LENGTH SQL mode is enabled.
For VARCHAR columns, trailing spaces in excess of the column length are truncated prior to insertion and a warning is generated
После этого не работало, пока не указал длину переменной VARCHAR(2) вместо VARCHAR(1). Подозреваю, это из-за того, что используемый Collation - utf8_general_ci (двухбайтовый). Если поменять на Collation, скажем, ascii_general_ci (однобайтовый), то будет работать и для VARCHAR(1).
Итак, конечная рабочая версия процедуры:
Отредактированно FiMko (03.03.2012 20:54:39)
Неактивен
Люблю такие темы
Всё подробно расписано и отвечать не надо. Почитал и сделал заметку в памяти о такой особенности.
Неактивен