首先检查您的数据库是否能够存储此字符。你可以这样做
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET';
AL32UTF8、UTF8、AL16UTF16 或 WE8ISO8859P7 等字符集能够存储希腊字符。
WE8ISO8859P1、US7ASCII 或 WE8MSWIN1252 等字符集不能够存储希腊字符。在这种情况下,您无法将它们插入到您的数据库中,并且您的任务到此结束。
另一个简单的测试是这样的 SQL 命令:
SELECT
ASCIISTR(CAST(UNISTR('\03A6') AS VARCHAR2(4))) AS VARCHAR_SUPPORT,
ASCIISTR(CAST(UNISTR('\03A6') AS NVARCHAR2(4))) AS NVARCHAR_SUPPORT,
CAST(UNISTR('\03A6') AS VARCHAR2(4)) AS VARCHAR_CHAR,
CAST(UNISTR('\03A6') AS NVARCHAR2(4)) AS NVARCHAR_CHAR
FROM dual;
VARCHAR_SUPPORT NVARCHAR_SUPPORT VARCHAR_CHAR NVARCHAR_CHAR
--------------- ---------------- ------------ -------------
\00BF \03A6 ¿ Φ
1 row selected.
如果您的输入代码点(在此示例中为 U+03A6,即 Unicode 字符 GREEK CAPITAL LETTER PHI)等于 ASCIISTR 的结果,则您的数据库可以存储该字符。在我的示例中,我可以将“Φ”插入NVARCHAR2(或NCHAR)列,但不能插入VARCHAR2(或CHAR)列。
如果您的数据库能够存储希腊字符,您始终可以在 SQL*Plus 中执行此命令:
INSERT INTO MY_TABLE VALUES (UNISTR('\03A6'));
根据您的要求,这可能是一项非常乏味的工作。我认为这种方法只是一个例外情况。
我不建议直接在 SQL*Plus 中输入这样的命令:
INSERT INTO MY_TABLE VALUES ('Φ');
在某些情况下它可能会起作用。到目前为止,我还没有完全理解我的 PC 的编码和 SQL*Plus 的编码之间的关系。
更安全的方法是将此类 SQL 语句写入 .sql 文件并保存。
为了运行它,请根据该文件的字符集设置您的NLS_LANG 环境变量。例如,当您将其保存为 UTF-8 然后运行(对于 Windows)
c:\>set NLS_LANG=.AL32UTF8
c:\>sqlplus user/pwd@DB @My_Inserts.sql
如果您的.sql-文件保存为ANSI,那么在“西方PC”上会是这样的:
c:\>set NLS_LANG=.WE8MSWIN1252
c:\>sqlplus user/pwd@DB @My_Inserts.sql
ANSIEncoding其实就是“当前本地编码”的意思。如果您没有本地代码页,您可以使用以下命令查询它:
C:\>reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v ACP
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
ACP REG_SZ 1252
C:\>