首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

SQL 截取超長字符串顯示省略號:LEFT+DATALENGTH/LEN、UNION ALL、Access/MySQL 差異處理

     編輯:PHP 相關知識

核心邏輯:分組處理

將數據分為「超長需截斷」和「正常長度」兩組,分別處理後 UNION ALL 合並。

SQL Server 版本 (推薦)

DECLARE @MaxLen INT = 25;

SELECT 
    ID,
    CASE 
        WHEN DATALENGTH(Description) > @MaxLen 
        THEN LEFT(Description, @MaxLen) + '...' 
        ELSE Description 
    END AS ShortDesc,
    Kind, DateTime, Author, Hit
FROM [xjx]
WHERE Kind = '活動簡報'
ORDER BY DateTime DESC;

優勢:單查詢、無 UNION、利用 CASE 表達式、DATALENGTH 計算字節長度 (中文 2 字節)。

通用 ANSI SQL 版本 (Access/MySQL 兼容)

-- Access 使用 LEN() 計算字符數 (中文算 1)
-- MySQL 使用 CHAR_LENGTH() 或 LENGTH()

SELECT ID,
       LEFT(Description, 25) + '...' AS ShortDesc,
       Kind, DateTime, Author, Hit
FROM [xjx]
WHERE LEN(Description) > 25 AND Kind = '活動簡報'

UNION ALL

SELECT ID,
       Description AS ShortDesc,
       Kind, DateTime, Author, Hit
FROM [xjx]
WHERE LEN(Description) <= 25 AND Kind = '活動簡報'

ORDER BY DateTime DESC;

MySQL 專用優化版

SELECT 
    ID,
    IF(CHAR_LENGTH(Description) > 25, CONCAT(LEFT(Description, 25), '...'), Description) AS ShortDesc,
    Kind, DateTime, Author, Hit
FROM xjx
WHERE Kind = '活動簡報'
ORDER BY DateTime DESC
LIMIT 5;

Access 專用版 (Jet/ACE 引擎)

SELECT ID,
       IIF(LEN(Description) > 25, LEFT(Description, 25) & "...", Description) AS ShortDesc,
       Kind, DateTime, Author, Hit
FROM xjx
WHERE Kind = '活動簡報'
ORDER BY DateTime DESC;

長度計算函數對比

函數SQL ServerMySQLAccess說明
DATALENGTH✓✗✗字節長度,中文 2 字節
LEN✓ (忽略尾部空格)✓ (字符數)✓ (字符數)字符長度
LENGTH✗✓ (字節數)✗字節長度
CHAR_LENGTH✗✓ (字符數)✗字符長度,多字節安全

應用層處理 (更靈活)

// PHP 示例
function truncate($str, $len = 25, $suffix = '...') {
    if (mb_strlen($str, 'UTF-8') <= $len) return $str;
    return mb_substr($str, 0, $len, 'UTF-8') . $suffix;
}

// 模板中直接使用
echo truncate($row['Description']);

總結

  • SQL Server:單查詢 CASE + DATALENGTH 最優
  • MySQL:IF + CHAR_LENGTH 或應用層 mb_substr
  • Access:IIF + LEN 或 UNION ALL 兼容寫法
  • 應用層處理:編碼安全、邏輯復用、支持 HTML 截斷保標簽完整
  • 避免在 WHERE 中對列使用函數導致索引失效,改用應用層或計算列
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved