傻逼 IBM 出的数据库服务器,网上资料少的可怜,用个Java官方的库db2jcc4.jar连class reference都找不到;官网文档页面慢得要死,还用js搞了个禁止复制。纯属傻逼。
傻逼弱智脑残IBM去死。
傻逼弱智脑残IBM去死。
傻逼弱智脑残IBM去死。
傻逼弱智脑残IBM去死。
傻逼弱智脑残IBM去死。
傻逼弱智脑残IBM去死。
傻逼弱智脑残IBM去死。
傻逼弱智脑残IBM去死。
config
env
# mysql compatiblity mode, enable "limit <n> offset <m>" sql syntax
db2set DB2_COMPATIBILITY_VECTOR=MYS
cli
貌似这货和另一个傻逼 Oracle一样,每个实例(instance)需要单独的OS 用户名登录?
例如如果数据库实例是 x, 先用 su - x
切换到 x 用户,然后在执行任意管理命令。
- db2ilist # 查看已安装的 db2 实例列表
- db2ls # 查看已安装的 db2 实例版本信息
- db2 list db directory # 数据库列表
- db2start # 启动数据库
- db2stop force; db2start # restart db2
- db2 "get dbm cfg"|grep -i svce # get db2 port
- db2set REGISTRYNAME[=VALUE] # view or set registry variable value
- db2cli execsql -connstring "DATABASE=db;HOSTNAME=hostname;PORT=123;UID=user;PWD=pass" # 进入执行sql的CLI界面。这个命令可以在任意机器上执行(指定了connstring后远程连接)
默认日志
~/sqllib/db2dump/db2diag.log
License
db2licm -l # view active licenses
db2licm -a db2aese_u.lic # install a license
Driver
Java JDBC Driver
// db2jcc4.jar (JDBC 4.0 DB2 Driver)
import java.sql.*;
try {
Class.forName("com.ibm.db2.jcc.DB2Driver"); // do not need manually load?
// DriverManager.registerDriver(new com.ibm.db2.jcc.DB2Driver());
Connection con = DriverManager.getConnection("jdbc:db2://host:5021/db:user=foo;password=123456;currentSchema=schema;");
} catch( Exception e) {
e.printStackTrace();
}
Or Use DataSource:
// db2jcc4.jar
import javax.sql.DataSource;
import com.ibm.db2.jcc.DB2SimpleDataSource;
DB2SimpleDataSource ds = new DB2SimpleDataSource(); // implementing javax.sql.DataSource
ds.setDriverType(4);
ds.setServerName("1.2.3.4");
ds.setPortNumber(50000);
ds.setDatabaseName("dbname");
ds.setUser("user");
ds.setPassword("pass");
ds.setCurrentSchema("schema");
ds.getConnection();
Tips:
- 如果不指定 schema,默认 schema 是登录数据库的用户名。
- 傻逼 DB2 这个数据库经常爆莫名其妙的错误,有时重启一下傻逼 DB2 服务就好了。
- 傻逼 DB2 的对象名(table,schame等)区分大小写。但是傻逼 IBM 提供的 傻逼 DB2 傻逼 Java 驱动(db2jcc4.jar)是一群脑残写的傻逼代码,其执行 "create table xx" 时会原封不动地创建一个 "xx" 表,但是执行 "select * from xx" 时却自动将 "xx" 转换成大写的 "XX" 传给数据库,所以然后就会爆 "SQLCODE=-204, SQLSTATE=42704" 错误。所以 create table 时必须显式地指定大写的 schema 和 table 名。( 或者在 select 时用双引号将大小表名括起来 select * from "XX" )
Solutions
常见 SQLCODE 错误码
-104: ILLEGAL SYMBOL "token". 比如 sql 语句语法错误,末尾多了一个分号等等 ;
-204: name IS AN UNDEFINED NAME, 表/视图不存在. 注意傻逼 DB2 的表名/视图名/schema名等区分大小写。
SQL0332N Character conversion from the source code page "1392" to the target
fix:
db2set DB2CODEPAGE=1386
Dummy Table
Use for connection validation:
select 1 from SYSIBM.SYSDUMMY1
Auto increment id field
create table student (
sid integer not null GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1)
,sname varchar(30)
,PRIMARY KEY (sid)
);
Operation not allowed for reason code "7"
修改了表的结构后,必须(?)执行下面存储过程,否则这个表有时无法访问。
call sysproc.admin_cmd('reorg table <schema_name>.<table_name>')