原文:
http://hi.baidu.com/xchinux/item/26691e1b95e3505f2a3e228c Oracle安装的是11g express edition.服务器端的字符集编码是Chinese_China.AL32UTF8. 用下面的语句可查询:
- select userenv('language') from dual;
客户端的编码从注册表中查询,为Chinese_China.ZHS16GBK.
Qt以前是用的Qt的oci插件来连接的,但现在Qt升级到了5.0-MinGW版本,编译Oracle的Qt
SQL Driver比较麻烦,所以想办法通过ODBC来连接。
- QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
- db.setDatabaseName("DRIVER={Oracle in XE};SERVER=XE");
- //db.setDatabaseName("ora_test0");
- db.setUserName("TEST");
- db.setPassword("123456");
- //db.setPort(1521);
- //db.setHostName("localhost");
- db.open();
- qDebug() << db.isOpenError() << db.isOpen();
上面这段代码是连接Oracle的,通过ODBC,(注意,db.open()返回的是false,判断是否连接上不能用它,而要用db.isOpen())。但连接后会出现
乱码,就是因为oracle服务器端和客户端的编码不一致。如果将客户端的编码改成和服务端的一致了,那Qt程序中字符集就正常了。
修改客户端字符集的方法是修改注册表:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_XE\NLS_LANG,将其值改成SIMPLIFIED CHINESE_CHINA.AL32UTF8,与服务器端字符集编码保持一致即可。
================================================
上面是Qt通过ODBC连接Oracle的
问题。下面讲PHP的,PHP我通过PDO_OCI来连接:
- $dsn1 = 'oci:dbname=(DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
- )
- (CONNECT_DATA =
- (SERVICE_NAME = XE)
- )
- )';
-
- $dsn2 = 'oci:dbname=//localhost:1521/XE';
-
- $pdo = new PDO($dsn2 . ';charset=utf8', "test", "123456");
上面的$dsn1和$dsn2都可以,要指定字符集编码,后面的就和普通PDO一样了。