Команда усечения MySQL - символы Юникода - PullRequest
2 голосов
/ 03 февраля 2010

В настоящее время я пытаюсь настроить значения, хранящиеся в таблице в MySQL. Сохраненные значения содержат ряд символов Unicode. Мне нужно обрезать до 40 байт памяти, но когда я пытаюсь:

UPDATE `MYTABLE` SET `MYCOLUMN` = LEFT(`MYCOLUMN`, 40);

MySQL слишком полезен и сохраняет 40 символов , а не 40 байтов . Есть ли способ обойти это?

С уважением и благодарностью,

gaioshin

Ответы [ 2 ]

3 голосов
/ 03 февраля 2010

Я не совсем уверен, действительно ли вы хотите урезать до 40 байтов.

Поскольку вы можете испортить символы Юникода, условие должно быть Msgstr "MAX 40 байтов, с последним действующим символом".

Я бы написал для этого сохраненную функцию. Я не уверен, что это работает, но я думаю, вы поймете мой дрейф:

DELIMITER &&&
CREATE FUNCTION MYTRUNCATE (subject VARCHAR(255) CHARACTER SET utf8, max_bytes INT UNSIGNED)
RETURNS VARCHAR(255) CHARACTER SET utf8
DETERMINISTIC
BEGIN
DECLARE byte_len INT;
DECLARE char_len INT;
DECLARE res VARCHAR(255) CHARACTER SET utf8;
SET res = LEFT(subject, max_bytes);
SET byte_len = BIT_LENGTH(res)/8;
SET char_len = CHAR_LENGTH(res);
WHILE byte_len > max_bytes DO
SET char_len = char_len - 1;
SET res = LEFT(res, char_len);
SET byte_len = BIT_LENGTH(res)/8;
END WHILE;
RETURN res;
END&&&
DELIMITER ;
0 голосов
/ 03 февраля 2010

LEFT безопасен для байтов.

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

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