iT邦幫忙

0

全國路名資料:新北市萬里區烏塗炭的塗怎麼弄進資料庫?

  • 分享至 

  • xImage

大家好。我在處理地址的路名部份,去政府資料開放平台下載全國路名。
https://data.gov.tw/dataset/35321

我的標題用的是三點水的的塗,但它那個字其實是兩點水的。在 excel 裡面沒問題,但是要弄進資料庫的時候,系統說

https://ithelp.ithome.com.tw/upload/images/20221011/201480983C0T12Jolv.jpg

然後要用那個名字存檔也不行
https://ithelp.ithome.com.tw/upload/images/20221011/20148098CZK3bwZlSU.jpg
只能存其它名字。

我這篇發問一開始把那個字複製過來,也無法發問,it邦幫忙給我 500 error。發現很多字都這樣。

我的資料庫是 MySQL, utf8mb4, utf8mb4_unicode_ci。也試過 utf16, utf32, 都沒辦法。竟然連 utf32 都不行?! 這個有解嗎?


找到原因了

用 utf8mb4, utf8mb4_unicode_ci 就可以。問題不在這裡。網友 James 的留言最接近,是工具軟體的問題。太神奇。

如下圖,
https://ithelp.ithome.com.tw/upload/images/20221012/20148098rzYFAK9GeS.jpg

這個資料庫工具是同一個。只是我原本的版本比較舊,剛剛去下載最新的試用版,裝在虛擬機裡面。所以左上角那個新版是虛擬機。竟然毫無掛礙的弄進去。

那舊版的又是怎麼塞進去,怎麼沒有說無法儲存?因為我用 php laravel 指令
php artisan migrage:refresh --seed
正常無錯誤。只是用查出來變成問號。

之前是用舊版資料庫工具的匯入功能,都失敗。

所以問題是:舊版的資料庫工具不支援本該正常的編碼?!

看更多先前的討論...收起先前的討論...
Samuel iT邦好手 1 級 ‧ 2022-10-11 12:47:50 檢舉
?
Samuel iT邦好手 1 級 ‧ 2022-10-11 12:48:11 檢舉
? 塗
我打兩種一個會變問號XDD
淺水員 iT邦大師 6 級 ‧ 2022-10-11 13:48:56 檢舉
我不知道你中間的過程,也許可以試試看
SET NAMES utf8mb4
hsiang11 iT邦好手 1 級 ‧ 2022-10-11 13:51:52 檢舉
第一次聽到這地名 真稀有
塗 ?

罕見字,系統有支援unicode 嗎
是你的windows不支援unicode做檔名,不是mySQL的編碼問題
James iT邦大師 6 級 ‧ 2022-10-11 14:23:35 檢舉
我在Linux用phpmyadmin測試mysql utf-8編碼不行,utf-16編碼可以,如果有問題可能是轉入的工具不支援utf-16
ronrun iT邦新手 4 級 ‧ 2022-10-12 00:23:35 檢舉
James 你的答案最接近!我找到原因了。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
mathewkl
iT邦高手 1 級 ‧ 2022-10-11 12:50:29

https://ebus.gov.taipei/EBus/VsSimpleMap?rid=16975&sec=1

直接代換成三點水避免各種需額外造字衍生的諸多麻煩

ronrun iT邦新手 4 級 ‧ 2022-10-11 13:02:57 檢舉

除了這個字,還有坪林區的石曹。有些網頁是寫這樣 石(石曹)社區,有的直接換字打石槽社區,但這樣石頭變成木頭,失去原味。好奇那些石字旁的曹怎麼存的起來?

mathewkl iT邦高手 1 級 ‧ 2022-10-11 13:18:21 檢舉

題外話 各地區縣府人員很常自己造字
包含地名、人名等都需要自己造字 所以換電腦的時候這方面都很頭痛

0
bsexp301479
iT邦新手 3 級 ‧ 2022-10-11 13:22:16

這個因為是特殊造字
超過unicode所支援的漢字範圍
所以無法顯示
通常要顯示這種特殊字的話需要到造字網
去下載特定的字到電腦中
但也只有支援有下載這個造字檔的電腦才能顯示

淺水員 iT邦大師 6 級 ‧ 2022-10-11 13:43:43 檢舉

unicode 有這些字

文字 unicode(16進位)
兩點塗 2137C
石曹 25562

應該說現在的相關應用程式似乎只支援到utf-8
超過utf-8的unicode就沒辦法了

淺水員 iT邦大師 6 級 ‧ 2022-10-11 15:59:27 檢舉

我不知道你說的 utf8 是指一般的 utf8 編碼還是 mysql 的

  • 一般的 utf8:可以編碼到 10FFFF (16進位)
  • mysql 的 utf8:一開始設計最多到 3 位元組,所以才有 utf8mb4 支援到 4 位元組的。編碼方式都是 utf8,只是最大空間不同而已
0
風聞有你
iT邦新手 1 級 ‧ 2022-10-11 13:55:55

可以參考這個
安裝 Unicode補完計畫

http://mh-resource.blogspot.com/2013/07/windows-8-unicode.html

froce iT邦大師 1 級 ‧ 2022-10-12 13:06:33 檢舉

不要再推這個了,這個是已經過時而且過世的專案。

0
alger_song
iT邦新手 5 級 ‧ 2022-10-11 14:43:03

欄位屬性用nvarchar就好了。
https://ithelp.ithome.com.tw/upload/images/20221011/20148434jajtgCUDVP.png

0
淺水員
iT邦大師 6 級 ‧ 2022-10-11 15:45:34

我猜是應用程式跟 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';
看更多先前的回應...收起先前的回應...
淺水員 iT邦大師 6 級 ‧ 2022-10-11 16:17:09 檢舉

同樣的道理,如果連線是 utf8 而不是 utf8mb4
從資料庫拿資料時,這些罕見字就會變成問號「?」
而 windows 是不允許使用問號當作檔案名稱的

PS. windows 除非系統太老舊,不然檔名是可以用這些罕見字的。(我手邊是 windows 10,可以使用)

ronrun iT邦新手 4 級 ‧ 2022-10-12 00:35:19 檢舉

我也是Windows10,真的不行。你試試兩點水的塗。我把解法回在本文裡。謝謝你喔。

淺水員 iT邦大師 6 級 ‧ 2022-10-12 12:02:00 檢舉

我也是Windows10,真的不行。你試試兩點水的塗。

有試過喔,我的 windows10 真的可以
實驗方式:對沒用的檔案重新命名,可以用罕見字當檔名。

所以問題是:舊版的資料庫工具不支援本該正常的編碼?!

我主要是在說原理
不論是 php(或其他語言)寫的程式,或是其他別人做好的程式(例如匯入工具)
程式跟資料庫溝通都離不開這些基本的原理
(可以研究一下 SET NAMES 做了哪些事)

其實除了連線的編碼
程式本身內部使用的字元編碼也會有影響
例如我在 cli 環境使用 mysql
就可能要考慮一下 code page 的設定

froce iT邦大師 1 級 ‧ 2022-10-13 15:19:21 檢舉

我記得這種狀況會是輸入法問題,windows在7以後都是用unicode存檔名了。
但如果用太舊的輸入法,會因為相容性保留了舊的big5檔名。

這也是上面為啥有人推補完計劃我會那樣回的原因。
補完計畫是補big5不是讓打出來的字變unicode。

0
ckp6250
iT邦好手 1 級 ‧ 2022-10-12 10:02:43

在中文全字庫裡,是有兩點水的,
https://www.cns11643.gov.tw/wordView.jsp?ID=997750

但,我發現,本站也存不進去。

我要發表回答

立即登入回答