php 中文資料排序

2022122510:42

中文unicode 並無法依照筆畫正確排序,需轉為 big5 格式才行
網路一堆寫的 mysql 中文排序 並不正確
例如
mysql> SELECT pid,title FROM mydata ORDER BY convert(substr(title,1,4) using big5) ASC;
        或 SELECT pid,title FROM mydata  ORDER BY convert(title using big5) ASC;
+-----+----------------+
| pid | title          |
+-----+----------------+
|  40 | 一樟           |
|  28 | 十一           |
| 138 | 士文           |
| 112 | 小田           |
|  33 | 三光           |
| 118 | 大竹坑         |
| 129 | 三地門         |
|  38 | 大安森林公園    |
| 169 | 上里           |
|  73 | 大河           |
|  56 | 上林           |
+-----+----------------

改用 gbk 也不行:
mysql> SELECT pid,title FROM mydata ORDER BY convert(title using gbk) ASC;
+-----+--------------------+
| pid | title              |
+-----+--------------------+
|  38 | 大安森林公園       |
|  73 | 大河               |
| 118 | 大竹坑             |
| 129 | 三地門             |
|  33 | 三光               |
| 169 | 上里               |
|  56 | 上林               |
|  28 | 十一份             |
| 138 | 士文               |
| 112 | 小公田             |
|  40 | 一樟               |
+-----+--------------------+



mysql> show collation like 'big5%';
+-----------------+---------+----+---------+----------+---------+
| Collation       | Charset | Id | Default | Compiled | Sortlen |
+-----------------+---------+----+---------+----------+---------+
| big5_chinese_ci | big5    |  1 | Yes     | Yes      |       1 |
| big5_bin        | big5    | 84 |         | Yes      |       1 |
+-----------------+---------+----+---------+----------+---------+

用 php 來排序的話
就是將 unicode中文字轉為 big5 格式
再以 big5文字來做排序
<?php

$arrP = [
 ['pid'=> 40, 'title'=>'一樟'],
 ['pid'=> 28, 'title'=>'十一'],
 ['pid'=>138, 'title'=>'士文'],
 ['pid'=>112, 'title'=>'小公田'],
 ['pid'=> 33, 'title'=>'三光'],
 ['pid'=>118, 'title'=>'大竹坑'],
 ['pid'=>129, 'title'=>'三地門'],
 ['pid'=> 38, 'title'=>'大安森林公園'],
 ['pid'=>169, 'title'=>'上里'],
 ['pid'=> 73, 'title'=>'大河'],
 ['pid'=> 56, 'title'=>'上林'],
];

#製作一個 big5 的中文資料
foreach($arrP as $key=>$data) {
    $title=$data['title'];
    $arrP[$key]['title_big5'] = iconv("UTF-8", "big5//TRANSLIT//IGNORE", $title);
}

#排序
$arrTmp = array_column($arrP, 'title_big5');
array_multisort($arrTmp , SORT_ASC, $arrP);

var_dump($arrP);

排序結果:
array(11) {
  [0]=>
  array(3) {
    ["pid"]=>
    int(40)
    ["title"]=>
    string(6) "一樟"
    ["title_big5"]=>
    string(4) "▒@▒▒"
  }
  [1]=>
  array(3) {
    ["pid"]=>
    int(28)
    ["title"]=>
    string(6) "十一"
    ["title_big5"]=>
    string(4) "▒Q▒@"
  }
  [2]=>
  array(3) {
    ["pid"]=>
    int(33)
    ["title"]=>
    string(6) "三光"
    ["title_big5"]=>
    string(4) "▒T▒▒"
  }
  [3]=>
  array(3) {
    ["pid"]=>
    int(129)
    ["title"]=>
    string(9) "三地門"
    ["title_big5"]=>
    string(6) "▒T▒a▒▒"
  }
  [4]=>
  array(3) {
    ["pid"]=>
    int(169)
    ["title"]=>
    string(6) "上里"
    ["title_big5"]=>
    string(4) "▒W▒▒"
  }
  [5]=>
  array(3) {
    ["pid"]=>
    int(56)
    ["title"]=>
    string(6) "上林"
    ["title_big5"]=>
    string(4) "▒W▒L"
  }
  [6]=>
  array(3) {
    ["pid"]=>
    int(138)
    ["title"]=>
    string(6) "士文"
    ["title_big5"]=>
    string(4) "▒h▒▒"
  }
  [7]=>
  array(3) {
    ["pid"]=>
    int(38)
    ["title"]=>
    string(18) "大安森林公園"
    ["title_big5"]=>
    string(12) "▒j▒w▒˪L▒▒▒▒"
  }
  [8]=>
  array(3) {
    ["pid"]=>
    int(118)
    ["title"]=>
    string(9) "大竹坑"
    ["title_big5"]=>
    string(6) "▒j▒˧|"
  }
  [9]=>
  array(3) {
    ["pid"]=>
    int(73)
    ["title"]=>
    string(6) "大河"
    ["title_big5"]=>
    string(4) "▒j▒e"
  }
  [10]=>
  array(3) {
    ["pid"]=>
    int(112)
    ["title"]=>
    string(6) "小田"
    ["title_big5"]=>
    string(4) "▒p▒▒"
  }
}