2012-12-13 38 views
1

我正面臨一個奇怪的問題。我有這樣的代碼。Oracle SQL - Substr沒有移除足夠的字符

insert into my_table 
    substr(my_name,1,199) 

給出的錯誤是:

值太大,列...(實際:246,最高:200)

在我的表中最大的名稱看,我有東西如:「8 " x12 &#34」

是否有可能某些字符集的東西正在進行,以便插入時,字符數增加?如果是這樣,我該如何記住它?在嘗試子串處理之前,我已經明確嘗試轉換爲UTF8,但這根本沒有幫助。

+1

你可以顯示my_name的問題情況和列定義的完整值。插入更通常'插入到表(列)值(列表)',短語法的任何原因? –

+2

您使用'substr',因此您可以減去199個字符,這可能是unicode中的246個字節,並且您的列被定義爲'varchar2(200字節)'。可能應該在這裏使用'substrb'? –

+0

你可以發佈用於該列的數據類型和長度嗎?你使用'varchar2(200字節)'或'varchar2(200 char)'?如果使用'bytes',則可能無法存儲200個字符,因爲某些字符需要多個字節 –

回答

2

我會建議嘗試:

insert into my_table(col) 
    select cast(substr(my_name,1,199) as varchar(200)) 

(我始終在刀片明確列名)

的顯式轉換爲varchar可以解決發動機思維字符串的問題太長。

2

根據以上兩條評論,您需要檢查基本知識。另外,如果你可以在選擇時執行substrb和substr,並觀察可能有用的差異。

這裏是一個偉大article

「歷史數據庫持有的字母數字數據列已使用它們存儲字節數。這種做法是爲等同於數量的字節數細 一直 定義 使用單字節字符集。隨着越來越多地使用多字節 字符集來支持全球化數據庫,問題是 字節不再等於字符。VARCHAR2和CHAR類型 支持兩種指定長度的方法:在...旁邊tes:VARCHAR2(10字節)。 這將支持最多10個字節的數據,可能少於兩個 字符在多字節字符集中。字符:VARCHAR2(10 char)。這將最多10個字符的數據,這可能是 多達40個字節的信息支持。」

諮詢

當使用多字節字符集,例如UTF8,因爲你的意圖是可能定義可實際上數據的存儲字符,你可以使用列:

  • 在VARCHAR2/CHAR定義的CHAR修飾符也就是說,使用VARCHAR2(80 CHAR),而不是VARCHAR2(80 )。

  • 會話或系統參數NLS_LENGTH_SEMANTICS將默認行爲從BYTE更改爲CHAR。

它不建議更改在系統級範圍此設置,而是一個會話範圍。

它說,

兩個問題,人們經常遇到,是:

  • 使用多字節字符集時,即一個VARCHAR2(N)不一定成立N個字符,但而是N個字節。

  • 在VARCHAR2字節的最大長度爲4000,並在CHAR是2000:

0

您還可以使用substrb:

insert into my_table 
    substrb(my_name,1,199) 

這將字符串限制前199個字節而不是字符。

相關問題