大家好。我在處理地址的路名部份,去政府資料開放平台下載全國路名。
https://data.gov.tw/dataset/35321
我的標題用的是三點水的的塗,但它那個字其實是兩點水的。在 excel 裡面沒問題,但是要弄進資料庫的時候,系統說
然後要用那個名字存檔也不行
只能存其它名字。
我這篇發問一開始把那個字複製過來,也無法發問,it邦幫忙給我 500 error。發現很多字都這樣。
我的資料庫是 MySQL, utf8mb4, utf8mb4_unicode_ci。也試過 utf16, utf32, 都沒辦法。竟然連 utf32 都不行?! 這個有解嗎?
找到原因了
用 utf8mb4, utf8mb4_unicode_ci 就可以。問題不在這裡。網友 James 的留言最接近,是工具軟體的問題。太神奇。
如下圖,
這個資料庫工具是同一個。只是我原本的版本比較舊,剛剛去下載最新的試用版,裝在虛擬機裡面。所以左上角那個新版是虛擬機。竟然毫無掛礙的弄進去。
那舊版的又是怎麼塞進去,怎麼沒有說無法儲存?因為我用 php laravel 指令php artisan migrage:refresh --seed
正常無錯誤。只是用查出來變成問號。
之前是用舊版資料庫工具的匯入功能,都失敗。
所以問題是:舊版的資料庫工具不支援本該正常的編碼?!
https://ebus.gov.taipei/EBus/VsSimpleMap?rid=16975&sec=1
直接代換成三點水避免各種需額外造字衍生的諸多麻煩
這個因為是特殊造字
超過unicode所支援的漢字範圍
所以無法顯示
通常要顯示這種特殊字的話需要到造字網
去下載特定的字到電腦中
但也只有支援有下載這個造字檔的電腦才能顯示
可以參考這個
安裝 Unicode補完計畫
http://mh-resource.blogspot.com/2013/07/windows-8-unicode.html
我猜是應用程式跟 mysql 連線設定的問題
下面我做了一個 php 範例
當使用 SET NAMES utf8
時會出現 Incorrect string value
錯誤
改成 SET NAMES utf8mb4
就可以正常寫入
建立測試資料表
CREATE TABLE `test_enc`(
`v_char` VARCHAR(64),
`f_char` CHAR(64)
) ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
php 測試程式
function responseError($info = "", $code = 500)
{
http_response_code($code);
header('Content-Type: text/html; charset=utf-8');
echo $info;
exit();
}
try {
$pdo = new \PDO('mysql:host=localhost;dbname=test', 'test', 'test');
$pdo->exec('SET NAMES utf8'); //這邊改成 utf8mb4 才能正確運作
} catch (\PDOException $e) {
responseError('[連線錯誤] ' . $e->getMessage());
}
$stmt = $pdo->prepare('INSERT INTO `test_enc`(`v_char`, f_char) VALUES (?,?)') or responseError('prepare 錯誤');
$stmt->bindParam(1, $testStr1) or responseError('bindParam 錯誤 1');
$stmt->bindParam(2, $testStr2) or responseError('bindParam 錯誤 2');
// $testStr1 = $testStr2 = '??';
$testStr1 = $testStr2 = hex2bin('f0a595a2f0a18dbc'); //因為 it邦幫忙貼不出正常文字,稍微轉一下
$stmt->execute() or responseError('錯誤: ' . $stmt->errorInfo()[2]);
echo 'OK';
同樣的道理,如果連線是 utf8 而不是 utf8mb4
從資料庫拿資料時,這些罕見字就會變成問號「?」
而 windows 是不允許使用問號當作檔案名稱的
PS. windows 除非系統太老舊,不然檔名是可以用這些罕見字的。(我手邊是 windows 10,可以使用)
我也是Windows10,真的不行。你試試兩點水的塗。我把解法回在本文裡。謝謝你喔。
我也是Windows10,真的不行。你試試兩點水的塗。
有試過喔,我的 windows10 真的可以
實驗方式:對沒用的檔案重新命名,可以用罕見字當檔名。
所以問題是:舊版的資料庫工具不支援本該正常的編碼?!
我主要是在說原理
不論是 php(或其他語言)寫的程式,或是其他別人做好的程式(例如匯入工具)
程式跟資料庫溝通都離不開這些基本的原理
(可以研究一下 SET NAMES 做了哪些事)
其實除了連線的編碼
程式本身內部使用的字元編碼也會有影響
例如我在 cli 環境使用 mysql
就可能要考慮一下 code page 的設定
我記得這種狀況會是輸入法問題,windows在7以後都是用unicode存檔名了。
但如果用太舊的輸入法,會因為相容性保留了舊的big5檔名。
這也是上面為啥有人推補完計劃我會那樣回的原因。
補完計畫是補big5不是讓打出來的字變unicode。
在中文全字庫裡,是有兩點水的,
https://www.cns11643.gov.tw/wordView.jsp?ID=997750
但,我發現,本站也存不進去。