Oracle
如何讓 imp 使用正確的字元集?
我正在嘗試將 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 字元集(這是預設設置)將數據導入數據庫。因此,導入器必須轉換字元以適應該字元,並且某些字元會變成您發現的多字節字元。有兩種方法可以解決這個問題:
- 如果您在新數據庫中不需要 Unicode,則使用與舊數據庫相同的字元集重新創建它。在舊數據庫上執行此程式碼以獲取字元集並使用它
SELECT parameter, value FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET';
一旦新舊數據庫具有相同的字元集,導入就不必進行轉換。
- 如果您可以預先創建表格,您可以使用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 並擁有更好的字元集,只要您的應用程序可以支持它,這可能是首選方法。