2015年1月20日 星期二

罕用字的處理方式

http://www.blueshop.com.tw/board/FUM200410061525290EW/BRD200410192321287T6.html

欄位要宣告成nvarchar(Ms SQL的資料格式),Oracle好像要設定啥東東才支援unicode,這我就不清楚了
MS SQL Server、Access基本上都是將資料存成unicode,IIS應該也要設定一下預設編碼為utf-8
剩下有問題的部份是你的程式,ASP檔案編碼要用UTF-8格式,前端的網頁記得加上charset=big5這玩意,後端的記得加上@CODEPAGE=65001。
輸入法的部份,要確定輸出的編碼是unicode的喔~~像是自然輸入法,
可以設定輸出的碼是哪一種,新注音預設是輸出unicode的,所以你才能夠打出罕用字。
----------------------------------------------------------------------------------------------------------------------------------------------
在 SQL Server 中處理 Unicode 字串常數時,必需為所有的 Unicode 字串加上前置詞 N
http://support2.microsoft.com/?id=239530
在 SQL Server 中處理 Unicode 字串常數時,您必需在所有的 Unicode 字串前加上大寫字母 N 做為前置詞,如《SQL Server 線上叢書》主題<使用 Unicode 資料>所述。「N」前置詞代表的是 SQL-92 標準中的國家語言,且必須為大寫。如果您沒有在 Unicode 字串常數前面加上 N 做為前置詞,則 SQL Server 會在使用字串前,先將其轉換成目前資料庫的非 Unicode 字碼頁。
----------------------------------------------------------------------------------------------------------------------------------------------
SQL Server - Unicode字元儲存與處理方式
http://caryhsu.blogspot.tw/2012_04_01_archive.html

由於各國有各國的語言與文字呈現方式,所以在以往儲存文字時,都會以特定字元碼加以儲存,如繁體中文就使用大五碼(Big5),而簡體中文則使用GB,但由於如果同一個系統中需要處理不同的語系或處理到一些罕用字時,常會有亂碼與處理上的問題,所以後來為了統一所有的字元碼,ISO/IEC 便製定(10646 國際編碼標準) 推出了 Unicode (UTF-8、UTF-16、UTF32),簡稱為萬國碼。

在一般的網頁應用程式上,在字元編碼,前端的網頁中你必須需要指定編碼,否則會以系統的預設值而定,但是在SQL Server中如果需要儲存與處理Unicode字元時,必須符合以下兩個條件。

必須條件:
1. 資料欄位需要支援 Unicode,請使用 nchar,nvarchar,ntext 型態。
2. 查詢Unicode 字串常數需要 N 前置詞,請參考以下文件:  

INF:SQL Server 中的 Unicode 字串常數需要 N 前置詞
http://support.microsoft.com/?id=239530   

相信大家先前對於上述的處理方式都已有一定的了解,但我最近遇到一個滿特別的情況,使用者有輸入一個罕用字,而在資料庫中因為使用nvarchar的型態,所以儲存的部份一切正常,但是只要查詢條件中有使用到此罕用字時,就會有查詢筆數上的問題,後來經過確認,發現主要是此字是屬於香港增補字符集,所以在處理上必須指定特定的定序,說明如下,其中最令人高興的事,在 SQL Server 2012中特別針對增補字符集推出了一個以 SC 結尾的定序,差別就在於如果你使用一般的定序時,如果有使用到增補字符集,透用LEN的函數查詢時,一個字會變成長度2,而如果使用類似substring進行取字時就會有問題,而Supplementary Character (SC) Collations就是主要用來解決這個問題,所以還沒升級的,動作要快了哦!
----------------------------------------------------------------------------------------------------------------------------------------------
用ADO.NET讀取ORACLE VARCHAR中的BIG5罕用字
http://blog2.darkthread.net/post-2008-10-10-read-tdcc-char-from-oracle-varchar.aspx
http://72.15.222.47/post-2008-12-04-write-user-define-char-to-oracle-varchar2.aspx



mysql自動備份

不建議的 MySQL 資料備份方式

http://phpbb-tw.net/phpbb/viewtopic.php?t=46722


討論windows下自動備份批次檔
http://xoops.tn.edu.tw/modules/xforum/viewtopic.php?post_id=28444
適當修改以下內容,然後存成一個 .bat 檔。

代碼:
@echo off
REM /* MysqlBinPath: MySQL 可執行檔路徑,結尾請不要放 "\"
REM * BackupPath: 放置 sql 備份檔的位置,結尾請不要放 "\"
REM * DBhost: 資料庫主機的位址,可用 dn 或 ip
REM * DBuser: 資料庫使用者名稱
REM * DBpass: 資料庫使用者密碼
REM * DBname: 資料庫名稱 
REM * Argument: 其他的參數 */
SET MysqlBinPath=D:\AppServ\mysql\bin
SET BackupPath=D:\Backup
SET DBhost=127.0.0.1
SET DBuser=username
SET DBpass=password
SET DBname=databasename
SET Argument=--opt --compress --force --default-character-set=utf8
REM /* 以下不必修改 */

REM /* 取得日期。參照: http://alexchuo.blogspot.com/2006/07/blog-post.html */
FOR /F "tokens=1-4 delims=/ " %%a IN ("%date%") DO (
SET _MyDate=%%a-%%b-%%c %%d
)

REM /* 以日期為檔名,匯出 .sql 檔案。 */
echo 資料庫 %DBname% 備份中……
"%MysqlBinPath%\mysqldump" --host=%DBhost% --user=%DBuser% --password=%DBpass% %Argument% %DBname% > "%BackupPath%\%_MyDate%.sql"

REM /* 偵錯處理,發生錯誤就停住畫面以便看清楚錯誤訊息。 */
IF NOT %ERRORLEVEL% == 0 (
del "%BackupPath%\%_MyDate%.sql
echo.
echo 不好了,好像出了什麼問題的樣子。請看上面的訊息吧!
pause
)

之後,只要執行這個 .bat 檔,就會在設定的目錄中依目前日期產生以 "西元年/月/日 星期幾.sql" 為檔名的備份檔了。您可以先自己執行一次試試看有沒有成功。
使用 Windows 的排程工具(控制台/排定的工作)定期執行這個 .bat 檔,就能輕鬆地遠端定期自動備份資料庫囉。

備份出來的 .sql 檔案並不會自動壓縮,您可以自行將這些 .sql 檔壓縮起來保存。
MySQL備份教學
http://www.dotblogs.com.tw/michaelchen/archive/2015/01/06/mysql_backup.aspx
[匯出單一資料庫]

mysqldump -u root -e -q -p --default-character-set=utf8 database_name > back.sql

[匯出單一資料表]

mysqldump -u root -e -q -p --default-character-set=utf8 database_name datatable_name > back.sql


[匯出全部資料庫]

mysqldump -u root -e -q -p --default-character-set=utf8 --all-databases > back.sql

[匯入單一資料庫]

mysql -u root -p database_name < back.sql --default-character-set=utf8

[匯入單一資料表]

mysql -u root -p database_name datatable_name < back.sql --default-character-set=utf8

[匯入全部資料庫]

mysql -u root -p < back.sql --default-character-set=utf8

[直接匯入到另外一台資料庫]

mysqldump -u root -e -q --password=XXX --all-databases --default-character-set=utf8 | mysql -u root -h IP位置 --password=XXXX --default-character-set=utf8

==============================

mysqldump 其實還有很多參數可以用,想知道可以到官網去查詢  http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html



在Windows Server設定自動備份MySQL資料庫

http://www.askasu.idv.tw/index.php/2011/07/08/1435/

MySQL單一資料庫備份還原語法
http://www.ddjhs.tc.edu.tw/admin/mysql/mysqldump.txt

◎MySQL單一資料庫備份還原語法:

1.備份
>mysqldump -u使用者名稱 -p密碼 資料庫名稱 > 備份檔名.sql
或
>mysqldump -u使用者名稱 -p密碼 資料庫名稱 > 備份檔名.sql --default-character-set=latin1 (中文資料庫有語系困擾時)

2.還原
>mysql -u使用者名稱 -p密碼 資料庫名稱 < 備份檔名.sql


◎MySQL全部資料庫備份還原語法:

1.備份
>mysqldump -u使用者名稱 -p密碼 --all-database > 備份檔名.sql
或
>mysqldump -u使用者名稱 -p密碼 --all-database > 備份檔名.sql --default-character-set=latin1 (中文資料庫有語系困擾時)

2.還原
>mysql -u使用者名稱 -p密碼 < 備份檔名.sql


◎注意事項:
1.備份檔內容之資料庫名或資料表名中若含'-',則該名稱前後要加'`',以免還原時出錯!使用舊版之mysqldump時會有所缺漏。
2.新版之MySQL對於關鍵字有所增補,如:release……等。若舊版有使用到(資料表或欄位名稱)可能造成還原時出錯!


----------其它有用的語法------------------------------------------

◎替換某欄位部份內容之語法:

1.所需之字串替換函式:

 REPLACE(str,from_str,to_str)

2.完整SQL語法:

 UPDATE `資料表` SET `欄位名` = REPLACE(`欄位名`,'舊字串','新字串') WHERE `欄位名` LIKE '%舊字串%'


如何在 Batch 檔取得系統的日期、時間欄位 (第三版)

http://blog.miniasp.com/post/2009/11/03/How-to-get-system-date-time-in-batch-file-part-III.aspx

從 Batch 取得日期時間還真囉唆,每次都要查資料 Copy / Paste 才能寫出計算日期時間的指令碼,最近有有需求要抓到「上一個月」的年份與月份,所以有用到數值運算的指令 ( SET /A ),所以乘機再整理一遍取得日期、時間欄位的程式碼。
取得今天日期 ( 其中 P0 代表「不滿 10 自動補零」的意思 )
REM 取得今天的年、月、日 (自動補零)
SET TodayYear=%date:~0,4%
SET TodayMonthP0=%date:~5,2%
SET TodayDayP0=%date:~8,2%

REM 取得今天的年、月、日 (純數字)
REM 2010/08/03 更新:以下是為了修正 Batch 遇到 08, 09 會視為八進位的問題
IF %TodayMonthP0:~0,1% == 0 (
 SET /A TodayMonth=%TodayMonthP0:~1,1%+0
) ELSE (
 SET /A TodayMonth=TodayMonthP0+0
)

IF %TodayMonthP0:~0,1% == 0 (
 SET /A TodayDay=%TodayDayP0:~1,1%+0
) ELSE (
 SET /A TodayDay=TodayDayP0+0
)

echo 日期 %TodayYear%/%TodayMonth%/%TodayDay%
echo 日期 %TodayYear%/%TodayMonthP0%/%TodayDayP0%
取得上個月的年、月 ( 其中 P0 代表「不滿 10 自動補零」的意思 )
REM 取得上個月的年、月
SET /A LastMonthYear=%TodayYear%+0
SET /A LastMonthMonth=%TodayMonth%-1
SET /A LastMonthMonthP0=%LastMonthMonth%
REM 修正年份與月份的數值
IF %LastMonthMonth% EQU 0 (SET /A LastMonthYear=%thisYear%-1)
IF %LastMonthMonth% EQU 0 (SET LastMonthMonth=12)
IF %LastMonthMonth% LSS 10 (SET LastMonthMonthP0=0%LastMonthMonth%)

echo 日期 %LastMonthYear%/%LastMonthMonth%
echo 日期 %LastMonthYear%/%LastMonthMonthP0%
取得當下時間 ( 時、分、秒、豪秒 )
REM 取得時、分、秒 、豪秒
SET Hour=%NowTime:~0,2%
SET Minute=%NowTime:~3,2%
SET Second=%NowTime:~6,2%
SET /A Millisecond=%NowTime:~9,2%*10

echo 時間 %Hour%:%Minute%:%Second%.%Millisecond%
上述關於取得「上個月」的年、月的重點就在於 Batch 可以提供基本的數學運算。另外對於 %time% 的精準度只有到「百分之一秒」,為了改以表達「豪秒」表達所以我將取得的數字乘以 10 處理。
執行 HELP SET 指令後關於 /A 選項(switch)的說明如下:
/A 指定在等號右方的字串是一個要被運算的數字運算式。您可以用運算式進行簡單的運算,而且支援下列
的運算子 (依照運算優先順序由高到低排列):

    ()                  - 組成一群
    ! ~ -               - 一元運算符
    * / %               - 數字運算元
    + -                 - 數字運算元
    << >>               - 邏輯位移
    &                   - 位元運算 and
    ^                   - 位元運算 exclusive or
    |                   - 位元運算 or
    = *= /= %= += –=    - 指定
    &= ^= |= <<= >>=
    ,                   - 運算式分隔字元

如果您使用了任何邏輯或餘數運算子,您必須將運算式兩邊括上引號。任何在運算式中非數字的字串會
被當作環境變數,並且在使用前會先將這些環境變數轉換為數字。如果您所指定的環境變數名稱尚未在
目前環境中定義,那麼它的值會被設為 0。這可以讓您用環境變數值來做運算,而不必打入所有的 % 
符號來取得它的值。如果 SET /A 是用指令檔之外的命令列執行,它會顯示運算式最後的數值。指定運
算子需要有個環境變數在等號的左方。0x 字首在數字前方代表十六進位數字、0b 字首代表二進位數字
或 0 字首代表八進位數字,否則數字值都是指十進位數字。所以 0x12 就和 18、022 等相同。請注意
八進位數字可能容易弄錯: 像 08 和 09 就不是正確的數字,因為 8 和 9 並不是八進位的正確數字。
相關連結