最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中文拼音排序的問題與解決方案

 更新時間:2025年09月11日 09:19:33   作者:沃夫上校  
這篇文章主要為大家詳細介紹了MySQL中文拼音排序的問題和相關(guān)解決方案,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

問題

在做通訊錄、人員列表等功能時,經(jīng)常會碰到按照中文拼音排序的問題。

我們在這里可以用一個簡單的例子進行說明

先創(chuàng)建測試數(shù)據(jù)

CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

INSERT INTO user (name) VALUES
('張三'),('李四'),('王五'),('趙六'),('錢七'),('孫八'),('周九'),('吳十');

下面,我們希望查出數(shù)據(jù),并且按照中文拼音順序排序

很簡單,這樣就行了

SELECT * FROM user ORDER BY name;

可是,執(zhí)行后卻發(fā)現(xiàn),結(jié)果似乎并不符合預期

這其實是因為,MySQL 默認字符集排序:

  • utf8mb4_general_ci
  • utf8mb4_unicode_ci

這些排序是 按 Unicode 編碼點排序,而不是拼音順序。

那么,我怎么實現(xiàn)中文拼音排序呢?

解決辦法

方法一

默認字符集排序不支持,那我不用默認字符集不就行了,看我的

SELECT * FROM user ORDER BY CONVERT(NAME USING gbk);

如果在 xml 里面使用,注意使用CDATA包裹

<select id="listUsers" resultType="User">
  SELECT id, name
  FROM user
  ORDER BY <![CDATA[CONVERT(name USING gbk)]]>
</select>

可行是可行,但是每次查詢都要做編碼轉(zhuǎn)化,有沒有更簡單粗暴的方法?

方法二

有的兄弟,有的

我們可以跳過編碼轉(zhuǎn)化這一個步驟,添加一個冗余字段,在數(shù)據(jù)變更時寫入拼音不就行了(空間換時間打法還是太強了)

我們先添加字段

ALTER TABLE user
ADD COLUMN pinyin VARCHAR(100) AFTER name;

再導入這樣一個依賴

<dependency>
    <groupId>com.belerweb</groupId>
    <artifactId>pinyin4j</artifactId>
    <version>2.5.1</version>
</dependency>

再建立對應工具類

public class PinyinUtil {
    /**
     * @param chinaStr 中文字符串
     * @return 中文字符串轉(zhuǎn)拼音 其它字符不變
     */
    public static String getPinyin(String chinaStr){
        HanyuPinyinOutputFormat formart = new HanyuPinyinOutputFormat();
        formart.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        formart.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        formart.setVCharType(HanyuPinyinVCharType.WITH_V);
        char[] arrays = chinaStr.trim().toCharArray();
        String result = "";
        try {
            for (int i=0;i<arrays.length;i++) {
                char ti = arrays[i];
                if(Character.toString(ti).matches("[\u4e00-\u9fa5]")){ //匹配是否是中文
                    String[] temp = PinyinHelper.toHanyuPinyinStringArray(ti,formart);
                    result += temp[0];
                }else{
                    result += ti;
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            e.printStackTrace();
        }
        
        return result;
    }
}

PinyinUtil.getPinyin()會根據(jù)中文字符串返回對應的拼音字符串

在涉及到數(shù)據(jù)變更(新增、修改、導入等場景)時,寫入冗余字段就行

String pinyin = PinyinUtil.getPinyin(name);
user.setPinyin(pinyin);

我們的測試數(shù)據(jù)表在經(jīng)過處理后,就變成了這樣

查詢時,對冗余字段排序即可

SELECT * FROM user ORDER BY pinyin;

當數(shù)據(jù)量超過 幾百萬條以上,方法二的優(yōu)勢會明顯

當然,方法一不用做多余操作,直接sql搞定,也是一個優(yōu)點

到此這篇關(guān)于MySQL中文拼音排序的問題與解決方案的文章就介紹到這了,更多相關(guān)MySQL中文拼音排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL DELETE語法使用詳細解析

    MySQL DELETE語法使用詳細解析

    此文章主要講述的是MySQL DELETE語法的詳細解析,以及一些在實際操作中值得我們大家注意的相關(guān)事項的描述,以下就是正文的主要內(nèi)容
    2013-03-03
  • MySQL安裝失敗的原因及解決步驟

    MySQL安裝失敗的原因及解決步驟

    因很多同學安裝mysql總是出問題,所以下面這篇文章主要給大家介紹了關(guān)于MySQL安裝失敗的原因及解決步驟,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • mysql密碼中有特殊字符&在命令行下登錄的操作

    mysql密碼中有特殊字符&在命令行下登錄的操作

    這篇文章主要介紹了mysql密碼中有特殊字符&在命令行下登錄的操作,具有很好的參考價值希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • MySQL主從搭建(多主一從)的實現(xiàn)思路與步驟

    MySQL主從搭建(多主一從)的實現(xiàn)思路與步驟

    通過MySQL主從配置,可以實現(xiàn)讀寫分離減輕數(shù)據(jù)庫壓力,最近正好遇到這個功能,所以這篇文章主要給大家介紹了關(guān)于MySQL主從搭建(多主一從)的實現(xiàn)思路與步驟,需要的朋友可以參考下
    2021-05-05
  • MySQL實現(xiàn)免密登錄的三種配置方式

    MySQL實現(xiàn)免密登錄的三種配置方式

    我們登錄MySQL的時候有時候會忘記root密碼,這時我們需要免密登錄,所以這篇文章給大家介紹了MySQL免密登錄的三種方式,文章通過是示例代碼給出了詳細的配置方案,需要的朋友可以參考下
    2024-03-03
  • mysql免安裝制作使用說明

    mysql免安裝制作使用說明

    mysql免安裝版本的制作方法,需要的朋友可以參考下。
    2010-08-08
  • MySQL 空間碎片的查看與回收

    MySQL 空間碎片的查看與回收

    ySQL數(shù)據(jù)庫在運行過程中可能會出現(xiàn)空間碎片的問題,本文就來介紹一下MySQL 空間碎片的查看與回收 ,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • MySQL事務(wù)及Spring隔離級別實現(xiàn)原理詳解

    MySQL事務(wù)及Spring隔離級別實現(xiàn)原理詳解

    這篇文章主要介紹了MySQL事務(wù)及Spring隔離級別實現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • MySQL全文檢索的實現(xiàn)示例

    MySQL全文檢索的實現(xiàn)示例

    全文搜索是一種在文本字段中查找關(guān)鍵詞的功能。在MySQL中,我們可以使用全文搜索來提高查詢的效率,本文主要介紹了MySQL全文檢索的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • 通過緩存+SQL修改優(yōu)雅地優(yōu)化慢查詢

    通過緩存+SQL修改優(yōu)雅地優(yōu)化慢查詢

    本文通過介紹緩存的基本原理和SQL語句的優(yōu)化手段,以及實際案例的分析,為讀者提供了一種簡單而有效的優(yōu)化思路。讀者可以通過本文了解到如何在不修改程序代碼的情況下,通過巧妙地運用緩存和SQL優(yōu)化技巧,提高程序的性能和響應速度。
    2023-04-04

最新評論

遂平县| 区。| 灵台县| 奉节县| 逊克县| 泽普县| 瑞丽市| 同江市| 嘉荫县| 会泽县| 辰溪县| 宜宾县| 望谟县| 龙游县| 洛隆县| 阳谷县| 海城市| 忻城县| 车险| 明星| 同心县| 沅陵县| 宜宾市| 阿瓦提县| 东港市| 宜兰市| 临沭县| 建湖县| 东乌| 梧州市| 孝昌县| 伊春市| 游戏| 县级市| 勐海县| 卢氏县| 平乡县| 乐陵市| 安顺市| 赫章县| 景泰县|