【问题标题】:MySQL truncation command - unicode charactersMySQL 截断命令 - unicode 字符
【发布时间】:2010-02-03 16:12:38
【问题描述】:

我目前正在尝试调整存储在 MySQL 表中的值。存储的值包含一系列 Unicode 字符。我需要截断到 40 字节的存储空间,但是当我尝试时:

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

MySQL 非常有用,它保留了 40 个字符,而不是 40 个字节。有没有办法解决这个问题?

问候和感谢,

外星人

【问题讨论】:

    标签: sql mysql database text-processing


    【解决方案1】:

    我不太确定你是否真的想截断到正好 40 个字节。

    由于您可能会弄乱 unicode 字符,因此条件应该是 "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 ;
    

    【讨论】:

    • 正在寻找正确的解决方案。只是想尽快给你这个想法。
    • 现在似乎可以工作了。将“CHARACTER SET utf8”调整为您正在使用的那个。
    • 酷极了 - 刚刚使用它,它似乎工作得很好 - 谢谢!
    【解决方案2】:

    LEFT 是字节安全的。

    如何修改列数据类型,使其只能容纳 40 个字节。 MySQL 会自动为您进行截断。

    ALTER TABLE table_name
      MODIFY column_name column_type_40_bytes;
    

    【讨论】:

    • 刚刚更改了定义,但不幸的是它没有奏效 - 我似乎无法找到强制 MySQL 将其定义为 40 个字节而不是 40 个字符的方法:(
    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 2015-08-03
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2010-10-23
    相关资源
    最近更新 更多