我正面臨一個奇怪的問題。我有這樣的代碼。Oracle SQL - Substr沒有移除足夠的字符
insert into my_table
substr(my_name,1,199)
給出的錯誤是:
值太大,列...(實際:246,最高:200)
在我的表中最大的名稱看,我有東西如:「8 " x12 &#34」
是否有可能某些字符集的東西正在進行,以便插入時,字符數增加?如果是這樣,我該如何記住它?在嘗試子串處理之前,我已經明確嘗試轉換爲UTF8,但這根本沒有幫助。
我正面臨一個奇怪的問題。我有這樣的代碼。Oracle SQL - Substr沒有移除足夠的字符
insert into my_table
substr(my_name,1,199)
給出的錯誤是:
值太大,列...(實際:246,最高:200)
在我的表中最大的名稱看,我有東西如:「8 " x12 &#34」
是否有可能某些字符集的東西正在進行,以便插入時,字符數增加?如果是這樣,我該如何記住它?在嘗試子串處理之前,我已經明確嘗試轉換爲UTF8,但這根本沒有幫助。
我會建議嘗試:
insert into my_table(col)
select cast(substr(my_name,1,199) as varchar(200))
(我始終在刀片明確列名)
的顯式轉換爲varchar可以解決發動機思維字符串的問題太長。
根據以上兩條評論,您需要檢查基本知識。另外,如果你可以在選擇時執行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:
您還可以使用substrb:
insert into my_table
substrb(my_name,1,199)
這將字符串限制前199個字節而不是字符。
你可以顯示my_name的問題情況和列定義的完整值。插入更通常'插入到表(列)值(列表)',短語法的任何原因? –
您使用'substr',因此您可以減去199個字符,這可能是unicode中的246個字節,並且您的列被定義爲'varchar2(200字節)'。可能應該在這裏使用'substrb'? –
你可以發佈用於該列的數據類型和長度嗎?你使用'varchar2(200字節)'或'varchar2(200 char)'?如果使用'bytes',則可能無法存儲200個字符,因爲某些字符需要多個字節 –