String truncate on length, but no chopping up of words allowed

后端 未结 8 1686
旧巷少年郎
旧巷少年郎 2020-12-15 19:33

I want to limit a string field length in MYSQL on a certain length, but I don\'t want any chopping up of words to occur.

When I do:

SELECT SUBSTRING(         


        
8条回答
  •  失恋的感觉
    2020-12-15 20:06

    @Andriy M. I liked very much your answer :) Anyway I find on my db it works better if you change lines 2 and 3 like this:

    SELECT
      IF(LENGTH(str)<=@len,str,LEFT(str, cutpos)) AS str1,
      IF(LENGTH(str)<=@len,'',SUBSTRING(str, cutpos + 1)) AS str2
    FROM (
      SELECT
        @str AS str,
        @len - IFNULL(NULLIF(LOCATE(' ', REVERSE(LEFT(@str, @len))), 0) - 1, 0) AS cutpos
      FROM @table
    ) s
    

    Don't know if it's my fault or what, but the other way it sometimes truncated strings on the first letter when their length was <@len, i.e. "First s" - "tring" instead of "First" "string" when @len=13

    I post you a working example:

    CREATE TABLE `test` (
      `sometext` varchar(65)
    );
    
    INSERT INTO `test` (`sometext`) VALUES
    ('Firs strin'),
    ('Alll right'),
    ('third string'),
    ('fourth string'),
    ('a longer example string'),
    ('Supercalifragilisticexpialidocious');
    
    SELECT
      IF(LENGTH(str)<=12,str,LEFT(str, cutpos)) AS str1,
      IF(LENGTH(str)<=12,'',SUBSTRING(str, cutpos + 1)) AS str2
    FROM (
      SELECT
        sometext AS str,
        12 - IFNULL(NULLIF(LOCATE(' ', REVERSE(LEFT(sometext, 12))), 0) - 1, 0) AS cutpos
      FROM test
    ) s
    

    And here is a not-working example using your original code:

    SELECT
      LEFT(str, cutpos) AS str1,
      SUBSTRING(str, cutpos + 1) AS str2
    FROM (
      SELECT
        sometext AS str,
        12 - IFNULL(NULLIF(LOCATE(' ', REVERSE(LEFT(sometext,12))), 0) - 1, 0) AS cutpos
      FROM test
    ) s
    

    I'm not sure if it's a utf8 issue, or I just misinterpreted your code, or what else...

提交回复
热议问题