【问题标题】:MySQL truncate text with ellipsisMySQL 用省略号截断文本
【发布时间】:2011-09-17 01:35:28
【问题描述】:

假设我有一个包含一列的 MySQL 表:“消息”。它是 TEXT 类型。 我现在想查询所有行,但文本可能很大(不是很大但很大),我只想得到它们的摘要。例如,可以将结果填充到列表中。

有没有办法将文本修剪到特定长度(例如,10 个字符),如果文本被修剪,则添加省略号?

例如:

Message
-----------
12345678901234
1234567890
12345
12345678901

查询结果:

1234567...
1234567890
12345
1234567...

谢谢!

【问题讨论】:

    标签: mysql text trim ellipsis


    【解决方案1】:

    您可以声明一个新的ELLIPSIS 函数以使您的查询可读:

    DELIMITER //
    
    CREATE FUNCTION ELLIPSIS ( str TEXT, max_length INT )
    RETURNS TEXT
    
    BEGIN
       DECLARE str_out TEXT;
    
       IF LENGTH(str) <= max_length THEN
          SET str_out = str;
          
       ELSE
          SET str_out = CONCAT(SUBSTR(str, 1, max_length-3), '...');
    
       END IF;
       
       RETURN str_out;
    
    END; //
    
    DELIMITER ;
    

    那么你只需这样做:

    SELECT ELLIPSIS(Message, 10);
    

    【讨论】:

    • 我眼睛的最佳解决方案。如果我可以建议(我认为是)一项改进:我会将缩短的字符串更改为 SET str_out = CONCAT(LEFT(str, max_length-3), '...');结果字符串不会超过“max_length”
    【解决方案2】:

    我的做法:

    • 设 x 为要显示的最大字符数(因此 x + 3 个点将是显示的最长字符串)
    • 你总是想要 LEFT(field,x)
    • 如果 LENGTH(field) > x + 3,则追加 3 个点
    • 否则,如果 LENGTH(field) > x,则追加字段的剩余部分
    SELECT CONCAT(
        LEFT(field,x),
        IF(LENGTH(field) > x+3,
           '...',
            IF(LENGTH(field) > x,
                MID(field,x+1,LENGTH(field)),
                ''
            )
        )
    ) FROM table
    

    【讨论】:

      【解决方案3】:

      这是一个简单的单行解决方案:

      IF(CHAR_LENGTH(message) > 10, CONCAT(LEFT(message, 7),"..."), message)
      

      【讨论】:

        【解决方案4】:

        或者...

        SELECT CONCAT(LEFT(message, 7), IF(LENGTH(message)>7, "…", ""))
        FROM table
        

        【讨论】:

        • 很好的答案!不过,您可能希望用三个句点替换省略号字符,因为并非所有字符编码都支持该字符。
        • 这是一个很好的方法,但是当字段长度在 7 到 10 个字符之间时会出现问题。
        【解决方案5】:
        select case when length(message) > 7 
        then concat(substring(message, 1, 7), '...')
        else message end as adapted_message
        from ...
        

        测试/确认:

        SELECT CASE WHEN LENGTH('1234567890') > 7 
        THEN CONCAT(SUBSTRING('1234567890', 1, 7), '...') 
        ELSE '1234567890' END AS adapted_message
        
        UNION  
        
        SELECT CASE WHEN LENGTH('12345') > 7 
        THEN CONCAT(SUBSTRING('12345', 1, 7), '...') 
        ELSE '12345' END AS adapted_message
        

        【讨论】:

        • 您可能希望使用char_length() 而不是length() 以确保截断发生在相同数量的字符... length() 返回以字节为单位的字符串长度,char_length() 返回字符长度。
        • 这个答案有一个非常常见但相当烦人的错误。应该是when length(message) &gt; 10。否则,生成的“截断”文本可能比原始文本更长。我在所有应用程序中都看到了这一点,甚至 Facebook。你不讨厌你必须点击“更多”才能看到两个字母吗? “更多”有 4 个!
        【解决方案6】:

        查看 MySQL 字符串函数,记录在 here。您应该能够使用substringconcat 的某种组合来实现您想要的行为。

        【讨论】:

          猜你喜欢
          • 2016-10-18
          • 1970-01-01
          • 1970-01-01
          • 2013-11-08
          • 2011-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多