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

SQL Server 自訂函數:漢字轉拼音首字母 (GBK/Unicode 區間對照法)

     編輯:關於SqlServer

純 T-SQL 實現中文拼音首字母轉換

利用 Unicode CJK 統一表意文字區間 (U+4E00~U+9FA5) 搭配 COLLATE Chinese_PRC_CS_AS_KS_WS 二進位比較,建立對照表映射首字母,無需 CLR、無需外部資源,效能可接受。

完整函數程式碼

CREATE FUNCTION dbo.fn_GetPinyinInitial (@str NVARCHAR(4000))
RETURNS NVARCHAR(4000)
AS
BEGIN
    DECLARE @word NCHAR(1), @py NVARCHAR(4000) = N'';
    WHILE LEN(@str) > 0
    BEGIN
        SET @word = LEFT(@str, 1);
        -- 判斷是否為 CJK 統一漢字區間
        SET @py += CASE
            WHEN UNICODE(@word) BETWEEN 0x4E00 AND 0x9FA5  -- 19968~40869
            THEN (
                SELECT TOP 1 PY FROM (
                    SELECT N'A' AS PY, N'駌' AS word UNION ALL SELECT N'B', N'簿' UNION ALL
                    SELECT N'C', N'錯' UNION ALL SELECT N'D', N'鵽' UNION ALL
                    SELECT N'E', N'樲' UNION ALL SELECT N'F', N'鳆' UNION ALL
                    SELECT N'G', N'腂' UNION ALL SELECT N'H', N'夻' UNION ALL
                    SELECT N'J', N'攈' UNION ALL SELECT N'K', N'穒' UNION ALL
                    SELECT N'L', N'鱳' UNION ALL SELECT N'M', N'旀' UNION ALL
                    SELECT N'N', N'桛' UNION ALL SELECT N'O', N'漚' UNION ALL
                    SELECT N'P', N'曝' UNION ALL SELECT N'Q', N'囕' UNION ALL
                    SELECT N'R', N'鶸' UNION ALL SELECT N'S', N'蜶' UNION ALL
                    SELECT N'T', N'箨' UNION ALL SELECT N'W', N'鷐' UNION ALL
                    SELECT N'X', N'鑂' UNION ALL SELECT N'Y', N'韻' UNION ALL
                    SELECT N'Z', N'咗'
                ) T
                WHERE word >= @word COLLATE Chinese_PRC_CS_AS_KS_WS
                ORDER BY PY ASC
            )
            ELSE @word  -- 非漢字保留原字元 (英數、標點)
        END;
        SET @str = RIGHT(@str, LEN(@str) - 1);
    END
    RETURN @py;
END;
GO

關鍵技術細節

技術點說明
Unicode 區間0x4E00 (19968) ~ 0x9FA5 (40869) 涵蓋 20,902 個常用漢字。
對照表原理每個聲母對應該聲母**最後一個**漢字(按拼音排序),利用 >= 找到首個大於等於目標字的聲母。
CollationChinese_PRC_CS_AS_KS_WS:簡體中文、區分大小寫、重音、假名、寬度,**逐位元組比較**,確保排序與拼音順序一致。
非漢字處理直接保留(如 'A'、'1'、'-'),適合混合字串。

測試與效能

SELECT dbo.fn_GetPinyinInitial(N'張三李四');  -- ZSLS
SELECT dbo.fn_GetPinyinInitial(N'ABC-123');   -- ABC-123
SELECT dbo.fn_GetPinyinInitial(N'長江大橋');   -- CJDQ
  • 純標量函數,**逐字迴圈**,長字串 (>50 字) 效能下降明顯。
  • 大批量轉換建議:CLR 函數 (C# Pinyin.GetInitials) 或應用層處理。

擴充:支援多音字與全拼

  • 多音字無法靜態解決,需詞典庫(如 pinyin4net)。
  • 全拼同理,建議應用層或 CLR 整合 Chinese.Pinyin 套件。

總結

此函數適合「姓名縮寫」、「編碼前綴」、「簡易檢索」等**低頻、短字串**場景。生產環境若需高吞吐、多音字正確,請改用 CLR 或應用層專用庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved