[20231012]如何檢視unicode編碼內容.txt

lfree發表於2023-10-16

[20231012]如何檢視unicode編碼內容.txt

--//今天看一條語句的執行計劃:
SYS@192.168.100.235:1521/orcl> @ dpc dtt2yfpx8jhp4 '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  dtt2yfpx8jhp4, child number 0
-------------------------------------
select *from  lis_sample_operate where barcode=:Barcode and
EXECUTE_STATE_TEXT='鎖定報告'
Plan hash value: 2118786184
----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name                          | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                               |        |       |    12 (100)|          |
|*  1 |  TABLE ACCESS BY INDEX ROWID BATCHED| LIS_SAMPLE_OPERATE            |      1 |   127 |    12   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | IX_LIS_SAMPLE_OPERATE_BARCODE |      8 |       |     4   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / LIS_SAMPLE_OPERATE@SEL$1
   2 - SEL$1 / LIS_SAMPLE_OPERATE@SEL$1
Peeked Binds (identified by position):
--------------------------------------
   1 - :1 (VARCHAR2(30), CSID=852): '1801158810'
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("EXECUTE_STATE_TEXT"=U'\9501\5B9A\62A5\544A')
   2 - access("BARCODE"=SYS_OP_C2C(:BARCODE))

--//注意過濾條件是U'\9501\5B9A\62A5\544A',當然檢視語句很容易知道字串的內容是'鎖定報告'.
--//換一句話,如果透過U'\9501\5B9A\62A5\544A'知道里面的內容呢?



National Character Set(NLS_NCHAR_CHARACTERSET) defines the encoding of NCHAR, NVARCHAR2, and NCLOB columns and is in 9i
and up consistently Unicode. eg. AL16UTF16
國家字符集(NLS_NCHAR_CHARACTERSET)定義了NCHAR、NVARCHAR2和NCLOB列的編碼,並在9i中表示和一致的統一碼。例如AL16UTF16

Character Set(NLS_CHARACTERSET) defines the encoding of CHAR, VARCHAR2, LONG, and CLOB columns, these can also be used
for storing Unicode. eg AL32UTF8 or UTF8
字符集(NLS_CHARACTERSET)定義了CHAR、VARCHAR2、LONG和CLOB列的編碼,也可以使用它們用於儲存Unicode。如AL32UTF8或UTF8
--//注:感覺這裡不對,clob列的編碼好像也是AL16UTF16.

The national Character set (NLS_NCHAR_CHARACTERSET) is used for data stored in NCHAR, NVARCHAR2, and NCLOB datatypes and
is a character set that is defined in addition to the (standard) database character set (NLS_CHARACTERSET), which is
used for CHAR, VARCHAR2, LONG and CLOB datatypes.
國家字符集(NLS_NCHAR_CHARACTERSET)用於儲存在NCHAR、NVARCHAR2和NCLOB資料型別和中的資料,和是在(標準)資料庫字符集
(NLS_CHARACTERSET)之外定義的字符集,即用於CHAR、VARCHAR2、LONG和CLOB資料型別。

SYS@192.168.100.235:1521/orcl> select parameter,value from NLS_DATABASE_PARAMETERS where parameter in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
PARAMETER              VALUE
---------------------- ---------
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET       ZHS16GBK

--//我看了我以前的測試 [20221012]簡單探究nvarchar2資料型別儲存.txt

BBED> x /rnxx *kdbr[1]
rowdata[44]                                 @8136
-----------
flag@8136: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8137: 0x00
cols@8138:    3

col    0[2] @8139: 46
col    1[7] @8142:  0x49  0x5f  0x55  0x53  0x45  0x52  0x31 --//I_USER1
col   2[14] @8150:  0x00  0x49  0x00  0x5f  0x00  0x55  0x00  0x53  0x00  0x45  0x00  0x52  0x00  0x31
--//你可以發現英文字元nvarchar2編碼前面每個多了0x00,這樣佔用空間會加倍,並且0x00在前。
--//我個人不建議在應該中匯出使用narchar2型別的,我講過開發使用的可能原因,就是濫用後沒有辦法統一varchar2型別全部使用
--//nvarchar2型別。

--//使用windows的記事本寫入如下內容:
a鎖定報告a
--//另存為a.txt,編碼選擇unicode。

D:\>xxd -c 20 a.txt
0000000: fffe 6100 0195 9a5b a562 4a54 6100 0d00 0a00       ..a....[.bJTa.....

--//U'\9501\5B9A\62A5\544A'
--//a 的編碼竟然是 6100,跟前面的測試反過來的,0x00在後,鎖 前面看到編碼9501 ,而現在看到的是0195
--//也就是實際上unicode big endian編碼,oracle設計真的很奇葩!!
--//前面的fffe 類似一種標識,估計表示檔案是unicode編碼檔案,實際上可以猜測unicode big endian編碼開頭就是feff。

--//這樣看U'\9501\5B9A\62A5\544A'表示怎麼就簡單了。

D:\>c:\windows\system32\echo feff 9501 5B9A 62A5 544A | xxd -r -p > b.txt

--//在使用記事本開啟b.txt就ok了。如果使用vim檢視,可以這樣設定:
--//vim下可以這樣操作,建立一個空檔案,設定gvim如下,再調入b.txt,就可以檢視裡面的內容了:
set bomb
set fileencodings=ucs-bom,utf-8,cp936,big5,latin1
set encoding=utf-8
:r b.txt

SYS@192.168.100.235:1521/orcl> select * from V$TRANSPORTABLE_PLATFORM;
PLATFORM_ID PLATFORM_NAME                     ENDIAN_FORMAT      CON_ID
----------- --------------------------------- -------------- ----------
          1 Solaris[tm] OE (32-bit)           Big                     0
          2 Solaris[tm] OE (64-bit)           Big                     0
          7 Microsoft Windows IA (32-bit)     Little                  0
         10 Linux IA (32-bit)                 Little                  0
          6 AIX-Based Systems (64-bit)        Big                     0
          3 HP-UX (64-bit)                    Big                     0
          5 HP Tru64 UNIX                     Little                  0
          4 HP-UX IA (64-bit)                 Big                     0
         11 Linux IA (64-bit)                 Little                  0
         15 HP Open VMS                       Little                  0
          8 Microsoft Windows IA (64-bit)     Little                  0
          9 IBM zSeries Based Linux           Big                     0
         13 Linux x86 64-bit                  Little                  0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         16 Apple Mac OS                      Big                     0
         12 Microsoft Windows x86 64-bit      Little                  0
         17 Solaris Operating System (x86)    Little                  0
         18 IBM Power Based Linux             Big                     0
         19 HP IA Open VMS                    Little                  0
         20 Solaris Operating System (x86-64) Little                  0
         21 Apple Mac OS (x86-64)             Little                  0
         22 Linux OS (S64)                    Big                     0
21 rows selected.

--//順便測試windows xp的記事本各種編碼的情況,記錄如下:
--//ANSI編碼                無開頭標識,直接就是檔案內容編碼。
--//Unicode (Little)        開頭標識fffe
--//Unicode Big endian      開頭標識feff
--//UTF-8                   開頭表示ef bb bf

--//UTF-8儲存的輸出。
D:\>xxd -c 20 a.txt
0000000: efbb bf61 e994 81e5 ae9a e68a a5e5 918a 610d 0a      ...a............a..

--// 刪除 定報告,UTF-8儲存的輸出。
D:\>xxd -c 20 a.txt
0000000: efbb bf61 e994 8161 0d0a                             ...a...a..
--//可以看出UTF-8 是一種可變長度的字符集,a -> 61, 鎖->e9 94 81

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2989215/,如需轉載,請註明出處,否則將追究法律責任。

相關文章