欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中文拼音排序的問(wèn)題與解決方案

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

問(wèn)題

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

我們?cè)谶@里可以用一個(gè)簡(jiǎn)單的例子進(jìn)行說(shuō)明

先創(chuàng)建測(cè)試數(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
('張三'),('李四'),('王五'),('趙六'),('錢(qián)七'),('孫八'),('周九'),('吳十');

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

很簡(jiǎn)單,這樣就行了

SELECT * FROM user ORDER BY name;

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

這其實(shí)是因?yàn)?,MySQL 默認(rèn)字符集排序:

  • utf8mb4_general_ci
  • utf8mb4_unicode_ci

這些排序是 按 Unicode 編碼點(diǎn)排序,而不是拼音順序。

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

解決辦法

方法一

默認(rèn)字符集排序不支持,那我不用默認(rè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>

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

方法二

有的兄弟,有的

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

我們先添加字段

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

再導(dǎo)入這樣一個(gè)依賴(lài)

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

再建立對(duì)應(yīng)工具類(lèi)

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()會(huì)根據(jù)中文字符串返回對(duì)應(yīng)的拼音字符串

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

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

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

查詢(xún)時(shí),對(duì)冗余字段排序即可

SELECT * FROM user ORDER BY pinyin;

當(dāng)數(shù)據(jù)量超過(guò) 幾百萬(wàn)條以上,方法二的優(yōu)勢(shì)會(huì)明顯

當(dāng)然,方法一不用做多余操作,直接sql搞定,也是一個(gè)優(yōu)點(diǎn)

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

相關(guān)文章

  • 解析如何使用Zend Framework 連接數(shù)據(jù)庫(kù)

    解析如何使用Zend Framework 連接數(shù)據(jù)庫(kù)

    本篇文章是對(duì)如何使用Zend Framework 連接數(shù)據(jù)庫(kù)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL報(bào)錯(cuò)Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre

    MySQL報(bào)錯(cuò)Expression #1 of SELECT list 

    這篇文章主要介紹了MySQL報(bào)錯(cuò)Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • MySQL索引類(lèi)型Normal、Unique和Full Text的講解

    MySQL索引類(lèi)型Normal、Unique和Full Text的講解

    今天小編就為大家分享一篇關(guān)于MySQL索引類(lèi)型Normal、Unique和Full Text的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • MySQL安全設(shè)置圖文教程

    MySQL安全設(shè)置圖文教程

    MySQL安全設(shè)置,跟mssql差不多都是以普通用戶(hù)權(quán)限運(yùn)行mysql。其它的也需要注意下。
    2011-01-01
  • MySQL load語(yǔ)句詳細(xì)介紹

    MySQL load語(yǔ)句詳細(xì)介紹

    這篇文章主要介紹了MySQL load語(yǔ)句詳細(xì)介紹,本文講解了load的基本語(yǔ)法、文件的路徑、配置選項(xiàng)、STARTING LINES選項(xiàng)、TERMINATED LINES選項(xiàng)等內(nèi)容,需要的朋友可以參考下
    2014-12-12
  • MySQL數(shù)據(jù)庫(kù)連接數(shù)查詢(xún)、配置簡(jiǎn)單示例代碼

    MySQL數(shù)據(jù)庫(kù)連接數(shù)查詢(xún)、配置簡(jiǎn)單示例代碼

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)連接數(shù)查詢(xún)、配置的相關(guān)資料,連接數(shù)與性能密切相關(guān),需要根據(jù)實(shí)際需求合理配置,通過(guò)設(shè)置最大連接數(shù)、使用連接池和優(yōu)化應(yīng)用程序連接邏輯,可以提高數(shù)據(jù)庫(kù)的穩(wěn)定性和性能,需要的朋友可以參考下
    2025-03-03
  • mysql where中如何判斷不為空的實(shí)現(xiàn)

    mysql where中如何判斷不為空的實(shí)現(xiàn)

    本文主要介紹了mysql where中如何判斷不為空的實(shí)現(xiàn),本文將針對(duì)這些空演示如何判斷是否為空,以及如何寫(xiě)sql過(guò)濾,包括使用判空函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • MySQL?InnoDB?Cluster搭建安裝教程

    MySQL?InnoDB?Cluster搭建安裝教程

    這篇文章主要介紹了MySQL?InnoDB?Cluster搭建安裝教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • 很全面的Mysql數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)表、數(shù)據(jù)基礎(chǔ)操作筆記(含代碼)

    很全面的Mysql數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)表、數(shù)據(jù)基礎(chǔ)操作筆記(含代碼)

    這篇文章主要為大家分享了很全面的Mysql數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)表、數(shù)據(jù)基礎(chǔ)操作筆記,感興趣的小伙伴們可以參考一下
    2016-04-04
  • mysql中between的用法及說(shuō)明

    mysql中between的用法及說(shuō)明

    這篇文章主要介紹了mysql中between的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評(píng)論