原來Oracle也不喜歡“蜀黍”
今天在部署一個指令碼的時候,碰到了一個奇怪的問題,指令碼執行過程中報了一個ora錯誤
ORA-01756: quoted string not properly terminated
ORA-01756: quoted string not properly terminated
看這個錯誤似乎是哪裡的標點符號出了問題,沒有正確結束,本來這個問題看起來很明顯,很可能是格式的問題,但是奇怪的是插入中文,有的語句可以,有的就不可以。
我們先來看看環境變數的設定,然後復現一下這個問題
$ echo $NLS_LANG
American_America.zhs16gbk
$ locale
LANG=en_US
LC_CTYPE="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_COLLATE="en_US"
LC_MONETARY="en_US"
LC_MESSAGES="en_US"
LC_PAPER="en_US"
LC_NAME="en_US"
LC_ADDRESS="en_US"
LC_TELEPHONE="en_US"
LC_MEASUREMENT="en_US"
LC_IDENTIFICATION="en_US"
LC_ALL=
檢視資料庫字符集
SQL> select *from database_properties where property_name='NLS_CHARACTERSET'
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ------------------------------
NLS_CHARACTERSET ZHS16GBK Character set
復現問題
建立一個臨時表test,然後向裡面插入兩條記錄
SQL> create table test(id number,title varchar2(20));
Table created.
第一條記錄沒有問題
SQL> insert into test values(1,'你好');
1 row created.
當嘗試插入“蜀黍”的時候就爆了格式錯誤,難道Oracle不喜歡這種稱謂?
SQL> insert into test values(2,'蜀黍');
ERROR:
ORA-01756: quoted string not properly terminated
如果在後面加一個空格,就可以了
SQL> insert into test values(2,'蜀黍 ');
1 row created.
我們來簡單看一下,是否那個空格還在那兒。
SQL>select '>'||title||'<',id from test
'>'||TITLE||'<' ID
---------------------- ----------
>蜀黍 < 2
還不甘心,決定使用trim來格式化一下,語句執行成功,但是沒有效果,空格還在那兒。
刪除第一條記錄,注意力就關注在
delete from test where id=1;
SQL> update test set title=trim(title);
1 row updated.
SQL> select '>'||title||'<',id from test;
'>'||TITLE||'<' ID
---------------------- ----------
>蜀黍 < 2
以上的方法和測試都不見效,那就使出大招,看看dump的結果
SQL> select dump(title) from test;
DUMP(TITLE)
--------------------------------------------------------------------------------
Typ=1 Len=7: 232,156,128,233,187,141,32
可以看到末尾顯示是32,是一個空格
SQL> select '>'||chr(32)||'<' from dual;
'>'
---
> <
修改secureCRT的字符集為預設的方式,即支援中文,然後再次插入,就沒有問題了。
SQL> insert into test values(2,'蜀黍 ');
1 row created.
這個時候重新審視資料,發現原來插入的那條記錄已經顯示為亂碼了。說明最開始插入就有字符集的問題了。
SQL> select * from test;
ID TITLE
---------- --------------------
2 銍?榛?
2 蜀黍
使用dump的方式可以看到兩者還是有著天壤之別。
SQL> select dump(title) from test;
DUMP(TITLE)
--------------------------------------------------------------------------------
Typ=1 Len=7: 232,156,128,233,187,141,32
Typ=1 Len=5: 202,241,202,242,32
這個時候我們再來看一看dump的結果,可以看到在UTF-8的情況是每個漢字佔用3個位元組,在GBK模式下,是佔用2個位元組。
所以字符集的問題總是一個熱點問題,客戶端的設定也尤為重要,需要考慮字符集的相容性。
我們先來看看環境變數的設定,然後復現一下這個問題
$ echo $NLS_LANG
American_America.zhs16gbk
$ locale
LANG=en_US
LC_CTYPE="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_COLLATE="en_US"
LC_MONETARY="en_US"
LC_MESSAGES="en_US"
LC_PAPER="en_US"
LC_NAME="en_US"
LC_ADDRESS="en_US"
LC_TELEPHONE="en_US"
LC_MEASUREMENT="en_US"
LC_IDENTIFICATION="en_US"
LC_ALL=
檢視資料庫字符集
SQL> select *from database_properties where property_name='NLS_CHARACTERSET'
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ------------------------------
NLS_CHARACTERSET ZHS16GBK Character set
復現問題
建立一個臨時表test,然後向裡面插入兩條記錄
SQL> create table test(id number,title varchar2(20));
Table created.
第一條記錄沒有問題
SQL> insert into test values(1,'你好');
1 row created.
當嘗試插入“蜀黍”的時候就爆了格式錯誤,難道Oracle不喜歡這種稱謂?
SQL> insert into test values(2,'蜀黍');
ERROR:
ORA-01756: quoted string not properly terminated
如果在後面加一個空格,就可以了
SQL> insert into test values(2,'蜀黍 ');
1 row created.
我們來簡單看一下,是否那個空格還在那兒。
SQL>select '>'||title||'<',id from test
'>'||TITLE||'<' ID
---------------------- ----------
>蜀黍 < 2
還不甘心,決定使用trim來格式化一下,語句執行成功,但是沒有效果,空格還在那兒。
刪除第一條記錄,注意力就關注在
delete from test where id=1;
SQL> update test set title=trim(title);
1 row updated.
SQL> select '>'||title||'<',id from test;
'>'||TITLE||'<' ID
---------------------- ----------
>蜀黍 < 2
以上的方法和測試都不見效,那就使出大招,看看dump的結果
SQL> select dump(title) from test;
DUMP(TITLE)
--------------------------------------------------------------------------------
Typ=1 Len=7: 232,156,128,233,187,141,32
可以看到末尾顯示是32,是一個空格
SQL> select '>'||chr(32)||'<' from dual;
'>'
---
> <
整個字串佔用了7個位元組,空格佔用一個,即每個漢字佔用3個,這個方式應該是在字符集為UTF-8的情況
檢視客戶端中設定的字符集,還確實就是UTF-8修改secureCRT的字符集為預設的方式,即支援中文,然後再次插入,就沒有問題了。
SQL> insert into test values(2,'蜀黍 ');
1 row created.
這個時候重新審視資料,發現原來插入的那條記錄已經顯示為亂碼了。說明最開始插入就有字符集的問題了。
SQL> select * from test;
ID TITLE
---------- --------------------
2 銍?榛?
2 蜀黍
使用dump的方式可以看到兩者還是有著天壤之別。
SQL> select dump(title) from test;
DUMP(TITLE)
--------------------------------------------------------------------------------
Typ=1 Len=7: 232,156,128,233,187,141,32
Typ=1 Len=5: 202,241,202,242,32
這個時候我們再來看一看dump的結果,可以看到在UTF-8的情況是每個漢字佔用3個位元組,在GBK模式下,是佔用2個位元組。
所以字符集的問題總是一個熱點問題,客戶端的設定也尤為重要,需要考慮字符集的相容性。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1795908/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 為什麼我們越來越不喜歡用網站?網站
- 不喜歡 IDE?試試看 grepgitviIDEGit
- Taro UI開發小程式實現左滑喜歡右滑不喜歡效果UI
- 用Flutter實現一個仿“探探”的左右滑動選擇喜歡/不喜歡的效果Flutter
- 日本玩家為什麼不喜歡PVP遊戲?遊戲
- 咋就這麼不喜歡手寫路由呢路由
- 抖音批量取消喜歡,批量取消抖音喜歡
- Java程式設計師不喜歡Golang的地方 - GavinJava程式設計師Golang
- “既要效能,也要安全”,這樣的Rust,誰不喜歡!Rust
- 別問了,我真的不喜歡這個註解!
- 如果你不喜歡瀏覽器的書籤欄瀏覽器
- oracle增加主鍵也不會了Oracle
- 最喜歡咖啡的國家(附原資料表)
- 喜歡=熟悉+意外
- 喜歡的話
- 論文也撞衫,你更喜歡哪個無錨點CenterNet?
- 為何很多程式猿不喜歡中國式飯局?
- 我為什麼會從程式不喜歡加{}到加{}
- 風變設計初體驗,原來我真正喜歡的是另一個行業行業
- 五個Java冠軍喜歡的Java 16強大功能 - oracleJavaOracle
- 喜歡繪畫嗎?Mac上的工具分享來了Mac
- 我喜歡於一一!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 川光我喜歡
- 使用者原來喜歡這樣的外設!VRgluv手套超額完成眾籌目標VR
- 美國人最喜歡的飲料(附原資料表)
- 為什麼很多公司都不喜歡用php,而喜歡用java呢PHPJava
- 幽默:Ruby on Rails建立者DHH自稱是DDD粉絲,不喜歡數學演算法,喜歡業務邏輯 - CoRecursive PodcastAI演算法AST
- Hub:研究顯示觀眾更喜歡Netflix的原創內容
- 錢景美好,遊戲廠商越來越喜歡廣告了遊戲
- 來,我們把玩一下謝耳朵最喜歡的珠子
- 不喜歡SAP GUI?那試試用Eclipse進行ABAP開發吧GUIEclipse
- 比較喜歡的詩詞
- 最喜歡的勵志句子
- 小易喜歡的單詞
- 黑客偷刪警察蜀黍檔案黑客
- 歡樂鬥地主x喜茶:天生一對小歡喜,打牌喝茶在一起
- 看過喜歡的文章不讓複製小技巧及簡化if寫法
- 應屆生好找工作嗎?阿里巴巴不喜歡招聘應屆生?阿里
- WUCG北區決賽完美收官,玩家歡度長假驚喜不斷!