2012-01-09 26 views
0

我需要測試我的應用程序是否正在從數據庫讀取特殊字符並以完全相同的方式顯示它們。爲此,我需要用所有可用的特殊字符填充數據庫表。但是,我不知道如何在SQL插入查詢中指定特殊字符。任何人都可以請我引導一個例子,我可以在查詢中插入一個特殊字符?爲了簡單起見,假設表格是City表格,Area和Avg_Temperature是2列。如果我需要在Avg_Temperature列中插入度(celcius/farhenheit)符號,應該如何編寫查詢?在Oracle表中輸入特殊字符失敗


* * [下午2:50美國東部時間2012/1/9編輯]按以下賈斯汀洞的建議,我也如下分析:

表:create table city(area number, avg_temperature nvarchar2(10));

日期: insert into city values (1100, '10◦C');

Query: 
select dump(avg_temperature, 1010) from city where area = 1100; 

O/P 
DUMP(AVG_TEMPERATURE,1010)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
---------------------------------------------------------- 
Typ=1 Len=8 CharacterSet=AL16UTF16: 0,49,0,48,0,191,0,67                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

Query 
select value$ from sys.props$ where name='NLS_CHARACTERSET'; 

O/P 
VALUE$ 
---------------- 
WE8MSWIN1252 

Query: 
select value$ from sys.props$ where name='NLS_NCHAR_CHARACTERSET'; 

O/P 
---------------- 
AL16UTF16 

似乎插入確實亂了特殊字符,如賈斯汀洞suggeste d。但我無法理解爲什麼會發生這種情況?任何人都可以提供相關建議嗎?

+0

什麼是數據庫字符集?什麼是國家字符集?你是否將數據加載到VARCHAR2列中?或者一個NVARCHAR2列?該字符是否存在於數據庫字符集中? – 2012-01-09 21:30:11

+0

@JustinCave:數據庫字符集:WE8MSWIN1252;國家CS:AL16UTF16。我會將數據加載到NVARCHAR2中。我不確定該字符是否存在於字符集中!我被告知在現有的數據庫中構建applcn,所以我想確保我不會遇到這些問題。你能指導我在哪裏我可以找到上面提到的字符集的允許字符 – 2012-01-09 21:38:45

+0

@ darkie15:當使用包含幾乎所有人類已知的字符的UTF16時,你應該沒有問題。真正的問題是從客戶端到服務器的傳輸(以及所有中間步驟,如導入文件,網頁,電子郵件等)。 – 2012-01-09 21:50:57

回答

1

首先,您不應將該符號存儲爲列的一部分。這就要求你申報列VARCHAR這將給你很多的,從長遠來看問題(例如,你不能總結()他們,你不能AVG()他們,等等)

,可以儲存在第二列中記錄溫度的單位(例如1 = celcius和2 =華氏度),並在前端顯示數據時將其轉換。如果你真的想存儲的象徵,申報單位的列作爲CHAR(1):再次

INSERT INTO readings 
(area, avg_temperature, units) 
VALUES 
(1000, 12.3, '°C'); 

但是:

CREATE TABLE readings 
(
    area    number(22), 
    avg_temperature number(10,3), 
    units    varchar(2) 
) 

然後你可以如下插入我不會建議存儲實際的符號。只存儲代碼!

+0

謝謝您的建議,但問題是度數符號僅僅是一個例子。我們實際上是從客戶端接收這些數據,並且它包含許多特殊字符(包括度數符號)。我不確定您的解決方案是否適合真實場景。 – 2012-01-09 21:42:45

+0

那麼真正的問題是什麼呢?我向你展示瞭如何插入學位符號的例子。 – 2012-01-09 21:43:35

1

首先你需要知道數據庫字符集是什麼。然後你需要知道你的「客戶端」連接正在使用什麼字符集。如果這些都相同,生活總是更容易。

如果你的databse是utf-8並且你的客戶端是utf-8,那麼你不需要做任何轉義的字符,你可以對所需的字符使用utf-8編碼。

在您的示例中,度數字符是unicode codepoint u + 00b0。

在utf-8中,這是一個雙字節序列:x'c2',x'b0'。

+0

「是否在輸入特殊字符時數據庫編碼混亂了?」不完全是。根據以上信息,您在數據庫級別使用Windows-1252字符集編碼 - 此字符集最多包含256個字符,其中0-127是標準ASCII集,128-255是由代碼頁定義定義的。如果您的SQLDEVELOPER客戶端被設置爲使用UTF-8編碼,那麼它使用UNICODE字符集(數千個字符)以及1字節,2字節,3字節或4字節編碼(取決於字符)。 – 2012-01-10 01:41:32

+0

繼續 - 標準ASCII字符(0-127)與UNICODE中的字符相同(在UTF-8中編碼爲單字節)與Windows-1252字符集相同,這就是爲什麼一切正常,直到您試圖存儲非易失性字符ASCII字符。將你的SQLDeveloper「環境」編碼切換到windows-1252 - 你應該沒問題,因爲數據庫和客戶端都會以相同的方式編碼字符。最終,你需要問你的客戶他們的數據編碼是什麼,以確保數據庫支持它。 – 2012-01-10 01:50:13