我已经从文件中得到了一些日期,并将它插入到数据库Oracle中。编码插入值Oracle
的问题就是一个例子:
列类型VARCHAR2,大小3个字节
我试着插入 'абв',看到了异常:ORA-12899:值过大列(实际:6,最大值:3)
这是因为每个字符都以两个字节编码。好的,现在我们将重新编码。数据库编码为AL32UTF8。该文件的编码是CP866。
的尝试失败重新编码:
Encoding srcEncodingFormat = Encoding.GetEncoding(866);
Encoding dstEncodingFormat = Encoding.UTF8;
byte[] originalByteString = srcEncodingFormat.GetBytes(s);
byte[] convertedByteString = Encoding.Convert(srcEncodingFormat,
dstEncodingFormat, originalByteString);
s = dstEncodingFormat.GetString(convertedByteString);
我们不能改变列类型。我们也不能使用VARCHAR2(3 CHAR)
。我该如何解决它?当数据插入数据库时,是否可以显式指定要添加的值的编码?
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET AL32UTF8
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 11.2.0.2.0
这是我的NLS参数。事实是,老板严格禁止在数据库级别更改某些内容。对不起,有没有办法做到这一点?
对于.NET,它取决于您在应用程序中使用哪个驱动程序/提供程序。一些从NLS_LANG(例如ODP.NET unmanged驱动程序)继承设置,另一些依赖于当前的Windows语言环境(例如ODP.NET托管驱动程序)以及其他总是使用UTF-16(例如来自Oracle的OraOLEDB)。 –
事实上,不建议这样的破解。无论如何,它不会在你的情况下工作。例如,如果您将字节式的'абв'作为CP866传输,那么这将导致Oracle将立即用占位符(例如'¿')替换UTF-8字符(即非有效字节值)的无效字符。提到的破解可能只适用于数据库字符集覆盖**任何**字节值的情况,例如所有ISO8859-x编码或Windows CPxxxx –