MySQL →  Обрезаем строку в юникоде

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

В PHP4 есть такая замечательная функция substr
string substr  ( string $string  , int $start  [, int $length  ] )

substr() возвращает подстроку строки string длиной length, начинающегося с start символа по счету.
Вся проблема в том что для кодировки unicode эта фунция работает некорректно.
                                    

Эту проблему я решил с помощью mysql. Поскольку данные хранятся в базе, логично было бы делать выборку и возвращать уже обрезанные данные. К тому же это будет значительно производительнее, чем выполнять эту операцию средствами php.

В MySQL есть такая же функция SUBSTR которая прекрасно работает со всеми кодировками. Единственный подводный камень — в MySQL строка начинается не с 0 как в php а с 1. Если вы вторым параметром укажите 0 то в результате получите пустую строку.

SELECT SUBSTR(username, 1, 20) username, SUBSTR(comment, 1, 20) comment FROM comments


Теперь при выводе нужно дать понять пользователю что комментарий обрезан, т.е проставить '...' за обрезанными комментариями.

Для этого используем конструкцию IF из синтаксиса MySQL. Если строка до обрезания не равна строке после обрезания то нужно добавить '...' к этому комментарию. Получим вот такой запрос:
SELECT uniq_id, IF(SUBSTR(username, 1, 20)=username, username, CONCAT(SUBSTR(username, 1, 20), '...')) username, IF(SUBSTR(comment, 1, 20)=comment, comment, CONCAT(SUBSTR(comment, 1, 20), '...')) comment FROM comments


В результате получаем как раз то что нам нужно:



Потом просто выводим уже готовые username и comment в нужном нам месте на странице.
2


Вставка изображения
Файл:
Ссылка:
Выравнивание:
Описание:
комментарии(1): 
igorok 25 августа 2009, 12:06 #
0 
а можно заюзать mb_substr

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста, или зарегистрируйтесь, если не зарегистрированы.