Oracle

如何讓 imp 使用正確的字元集?

  • January 23, 2012

我正在嘗試將 dmp 文件從一個數據庫導入到另一個數據庫。問題是一些特殊的丹麥字元沒有正確導入,因為在導入過程中進行了一些字元映射轉換。

這是我使用 imp 開始導入時的資訊(請參閱有關可能的字元轉換的註釋):

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

Export file created by EXPORT:V10.02.01 via conventional path

import done in WE8ISO8859P1 character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing USERNAME's objects into USERNAME    
. . importing table                      "TABLE2" 
IMP-00019: row rejected due to ORACLE error 12899
IMP-00003: ORACLE error 12899 encountered
ORA-12899: værdi er for stor for kolonnen "USERNAME"."TABLE2"."NAME" (faktisk: 32, maksimum: 30)
Column 1 408261
Column 2 KUBEN FÆLLES MÅLER            

每個特殊字元(通常為 Æ、Ø 和 Å)都使用 2 個字元而不是 1 個字元,並且數據用空格填充以填充,因此這會導致數據包含該欄位的 31 個字元的錯誤,並且該欄位已定義尺寸為 30。

生成 dmp 文件的導出是這樣執行的:

SET CHARACTERSET=WE8PC850
SET NLS_LANG=DANISH
SET NLS_NUMERIC_CHARACTERS=.,
exp username/password@server1 dumpfile.dmp

導入是這樣執行的:如何使其正常工作?

SET CHARACTERSET=WE8PC850
SET NLS_LANG=DANISH
SET NLS_NUMERIC_CHARACTERS=.,
imp username/password@server2 fromuser=username touser=username commit=y ignore=y file=dumpfile.dmp log=dumpfile.log

可以做些什麼來做到這一點?似乎imp忽略了使用的字元集,因為導入伺服器使用 AL32UTF8(這是錯誤的)。

您正在使用 AL32UTF8 字元集(這是預設設置)將數據導入數據庫。因此,導入器必須轉換字元以適應該字元,並且某些字元會變成您發現的多字節字元。有兩種方法可以解決這個問題:

  1. 如果您在新數據庫中不需要 Unicode,則使用與舊數據庫相同的字元集重新創建它。在舊數據庫上執行此程式碼以獲取字元集並使用它
SELECT parameter, value
FROM nls_database_parameters
WHERE parameter
LIKE '%CHARACTERSET';

一旦新舊數據庫具有相同的字元集,導入就不必進行轉換。

  1. 如果您可以預先創建表格,您可以使用NLS_LENGTH_SEMANTICS參數。如果將其設置為 CHAR 而不是 BYTE 的預設值,則將為 VARCHAR2(5) 分配足夠的空間來在數據庫字元集中儲存 5 個字元(可能最多 20 個字節)而不是 5 個字節(可能只允許 1 個字元)。或者,您可以修改表創建 DDL 以將 CHAR 添加到每個 VARCHAR2 列聲明。例如
CREATE TABLE xyz (column_x VARCHAR2(10 CHAR) NOT NULL);

通過這種方式,您可以將數據轉換為 Unicode 並擁有更好的字元集,只要您的應用程序可以支持它,這可能是首選方法。

引用自:https://serverfault.com/questions/317151