- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个Oracle数据库,以简体中文存储一些数据值。我创建了一个应该显示此信息的ASP.net MVC C#网页。我正在使用OdbcConnection
来检索数据,但是,当我运行da.Fill(t)
命令时,值返回为“?”。
OdbcCommand cmd = new OdbcCommand();
cmd.CommandText = select;
OdbcConnection SqlConn = new OdbcConnection("Driver={Oracle in instantclient_11_2};Dbq=Database;Uid=Username;pwd=password;");
DataTable t = new DataTable();
cmd.Connection = SqlConn;
SqlConn.Open();
OdbcDataAdapter da = new OdbcDataAdapter(cmd);
SqlConn.Close();
da.Fill(t);
return t;
t
有数据,但是所有应该是汉字的内容只是一系列“ ?????”
最佳答案
字符集的问题很常见,让我尝试给出一些一般性注释。
原则上,您必须考虑四种不同的字符集设置。
1和2:NLS_CHARACTERSET
和NLS_NCHAR_CHARACTERSET
示例:AL32UTF8
它们仅在您的数据库上定义,您可以使用
SELECT *
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
NLS_LANG
AMERICAN_AMERICA.AL32UTF8
NLS_LANG
定义,也可以由Windows注册表的
HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG
(对于32位)定义。
HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG
(用于64位)。根据您的应用程序,可能还有其他方法可以指定NLS_LANG,但让我们坚持基础知识。如果未提供NLS_LANG值,则Oracle默认将其设置为
AMERICAN_AMERICA.US7ASCII
NLS_LANG=language_territory.charset
。 NLS_LANG的{charset}部分未显示在任何系统表或视图中。 NLS_LANG定义的所有组件都是可选的,因此以下定义均有效:
NLS_LANG=.WE8ISO8859P1
,
NLS_LANG=_GERMANY
,
NLS_LANG=AMERICAN
,
NLS_LANG=ITALIAN_.WE8MSWIN1252
,
NLS_LANG=_BELGIUM.US7ASCII
。
NLS_LANG
的{charset}部分在任何系统表/视图或任何功能的数据库中均不可用。严格来说,这是正确的,但是您可以运行以下查询:
SELECT DISTINCT CLIENT_CHARSET
FROM V$SESSION_CONNECT_INFO
WHERE (SID, SERIAL#) = (SELECT SID, SERIAL# FROM v$SESSION WHERE AUDSID = USERENV('SESSIONID'));
NLS_LANG
设置返回字符集-但是根据我的经验,该值通常为NULL或
Unknown
,即不可靠。
NLS_LANG
,那里的设置没有任何效果,例如:
NLS_LANG
文件的编码的“真实”字符集
.sql
UTF-8
询问代码页,在Unix / Linux上等效为
chcp
或
locale charmap
。您可以从以下位置获取所有Windows代码页标识符的列表:
Code Page Identifiers。注意,对于UTF-8(
echo $LANG
),存在一些问题,请参见
this discussion。
chcp 65001
文件和TOAD或SQL-Developer之类的编辑器,则必须检查保存选项。通常,您可以选择
.sql
,
UTF-8
,
ANSI
等值。
ISO-8859-1
表示Windows ANSI代码页,通常为
ANSI
,您可以在
CP1252
或以下位置签入注册表:
National Language Support (NLS) API Reference
HKLM\SYSTEM\ControlSet001\Control\Nls\CodePage\ACP
和终端的“真实”字符集。应用程序或
NLS_LANG
文件的编码
.sql
WE8PC850
WE8MSWIN1252
WE8ISO8859P1
WE8ISO8859P15
SELECT VALUE AS ORACLE_CHARSET, UTL_I18N.MAP_CHARSET(VALUE) AS IANA_NAME
FROM V$NLS_VALID_VALUES
WHERE PARAMETER = 'CHARACTERSET';
AL32UTF8
值继承字符集,因此上述条件始终为true。
NLS_LANG
值?
NLS_CHARACTERSET
和客户端字符集
NLS_CHARACTERSET=AL32UTF8
,则尽管这些字符集完全不同,但它可以正常工作(前提是您的客户端确实使用GB18030)。
GB18030是中文常用的字符集,例如
NLS_LANG=.ZHS32GB18030
,它支持所有Unicode字符。
UTF-8
和
NLS_CHARACTERSET=AL32UTF8
,它也将起作用(再次,前提是您的客户确实使用ISO-8859-P1)。但是,数据库可能会存储您的客户端无法显示的字符,而是客户端将显示一个占位符(例如
NLS_LANG=.WE8ISO8859P1
)。
C:\>set NLS_LANG=.AL32UTF8
C:\>sqlplus ...
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 CharSet VARCHAR2(20);
3 BEGIN
4 SELECT VALUE INTO Charset FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
5 DBMS_OUTPUT.PUT_LINE('Database NLS_CHARACTERSET is '||Charset);
6 IF UNISTR('\20AC') = '€' THEN
7 DBMS_OUTPUT.PUT_LINE ( '"€" is equal to U+20AC' );
8 ELSE
9 DBMS_OUTPUT.PUT_LINE ( '"€" is not the same as U+20AC' );
10 END IF;
11 END;
12 /
Database NLS_CHARACTERSET is AL32UTF8
"€" is not the same as U+20AC
PL/SQL procedure successfully completed.
¿
,但是字符不匹配。原因是,我的
AL32UTF8
以及SQL * Plus也使用Windows CP1252。因此,我必须相应地设置NLS_LANG:
C:\>chcp
Active code page: 1252
C:\>set NLS_LANG=.WE8MSWIN1252
C:\>sqlplus ...
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 CharSet VARCHAR2(20);
3 BEGIN
4 SELECT VALUE INTO Charset FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
5 DBMS_OUTPUT.PUT_LINE('Database NLS_CHARACTERSET is '||Charset);
6 IF UNISTR('\20AC') = '€' THEN
7 DBMS_OUTPUT.PUT_LINE ( '"€" is equal to U+20AC' );
8 ELSE
9 DBMS_OUTPUT.PUT_LINE ( '"€" is not the same as U+20AC' );
10 END IF;
11 END;
12 /
Database NLS_CHARACTERSET is AL32UTF8
"€" is equal to U+20AC
PL/SQL procedure successfully completed.
CREATE TABLE ARABIC_LANGUAGE (
LANG_CHAR VARCHAR2(20),
LANG_NCHAR NVARCHAR2(20));
INSERT INTO ARABIC_LANGUAGE VALUES ('العربية', 'العربية');
cmd.exe
设置两个不同的值-这是不可能的。
关于c# - OdbcConnection返回汉字为“?”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33783902/
我正在使用这样的辅助方法: private OdbcCommand GetCommand(string sql) { string conString = "blah"
protected OdbcConnection conectarBD() { String StringDeConexion = "Data Source=PABLOZN\\SQLEXPRE
在这里用头撞墙 我们是独立软件开发商,有数百家公司在使用我们的软件,没有任何问题。该软件是 .NET 2.0 上的 Winforms/C#。 我们的一位客户安装了我们的软件,但在他们所有的机器上启动时
考虑一个简单的设置: // _conn is the OdbcConnection with a MySQL-Server (MySQL-Connector 3.51) // _cmd is a cr
我猜测并非所有 SQL 都是平等创建的。我正在深入研究 C# 中的 DSN 和 ODBC 驱动程序的世界,并尝试了一下。我正在尝试获取由 DSN 定义的数据库中的所有表,我所知道的是使用 Transo
我完成了在我的计算机中创建服务器和客户端 ODBC 对象到 Cobol 数据库的过程,并将客户端命名为 PARSECCLI。 我测试了连接,它工作正常。我可以通过 Microsoft Query 获取
需要考虑的两种刷新方法之间是否有任何区别,或者实际上是否相同,可以使用其中任何一种? Sub refresh() Dim workbook_connection As Excel.Workbook
我正在使用 ASP.net 创建 Web 应用程序。我使用 OdbcConnection 连接到 MySQL。但它似乎创建了对象但没有填充数据源和数据名字段。我有一个著名的错误 [IM002] [Mi
我想将 PostgreSQl DB 连接到我的 C# 项目,我找到了这段代码 OdbcConnection DbConnection = new OdbcConnection("connection_
在连接到多个可能的数据源(与数据库无关)方面,上述每种 C# 数据库连接方法的主要优点是什么?同样在性能方面,哪一个可能提供全面的最佳性能? 最后,对于与数据库无关的应用程序,您是否有任何理由避免使用
我的 VB.NET Windows 窗体应用程序中有以下代码: Case "DB2" Try Dim row As DataRow Using cnDB2 As
我正在尝试使用 C# 中的 OdbcConnection 连接到 MySQL 数据库。我收到以下错误: An unhandled exception of type 'System.Data.Odbc
我想使用 Odbc 从 C# 连接到 Access MDB 文件。 当我尝试执行时 OdbcConnection con = new OdbcConnection( "Driver={Micr
Windows 10 Pro 计算机上的 Excel 2016:我可以打开工作簿并从 DATA / From Other Sources / Data Connection Wizard / odbc
我正在尝试使用 System.Data.Odbc.OdbcConnection 查询 DBF 文件。当文件中没有空格时它可以正常工作,但如果文件路径或名称中有一个空格。 我正在使用以下代码: oCon
我正在使用 Microsoft Visual Web Developer 2010 Express 构建一个网页,该网页从数据库中提取数据以使用相关选项填充下拉列表。当我在开发人员中调试页面时,一切正
我有一个 .net 4.0 c# 应用程序,它需要一个 odbc 连接到 mssql 2008。该连接通常工作正常。但是当我运行一个通常运行几分钟的查询时(不,在项目的这一点上我无法优化查询运行时)我
我有一个 Excel 工作表,其中包含一个列表,该列表通过在宏中使用列表的 ODBC 连接填充,使用以下属性: ListObject.QueryTable.WorkbookConnection.ODB
我是一名优秀的程序员,十分优秀!