【java】arcII码为0x01,0x02作为分隔符

本文介绍了一种使用特殊字符进行字符串拼接的方法,以避免常见的安全问题。通过使用ASCII码中不可见且不易被误输入的字符(如0x01和0x02),可以确保字符串拼接的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不知道大家在拼接字符串的时候是怎么做的?是不是采用,或:? 
这样做有的时候不很安全,因为你不能确保你传入的字符串中没有这几个字符,那怎么做能保证万无一失呢? 

arcII码为0x01,0x02的字符是键盘所不能输入的,因为用这个能保证万无一失。 

public String GetEnterpriseInfo(String code) {
		
		Connection cn = null;
		PreparedStatement stm = null;
		ResultSet rs = null;
		String s = "";
		byte  b1[] = {0x02};
		byte  b2[] = {0x01};
		String str1 = new String(b1); 
		String str2 = new String(b2); 
		try {
			cn = DBUtil.getConn();
			String sql = "select station_id,station_desc from  t_cfg_station_info where area_id like '%"+code+"%'";
			stm = cn.prepareStatement(sql);
			rs = stm.executeQuery();
			while(rs.next()){
				s += rs.getString(1)+str1+rs.getString(2)+str2;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(rs, stm, cn);
		}
		return s;
	}


<think>我们正在处理一个关于SQL*Loader控制文件的问题,用户希望使用0x01(即ASCII字符1,SOH)作为分隔符。 在SQL*Loader控制文件中,我们通常使用`FIELDS TERMINATED BY`来指定分隔符。对于特殊字符,我们可以用十六进制表示或转义序列表示。 根据Oracle文档,我们可以使用`X'十六进制值'`来表示一个十六进制字符。因此,0x01可以表示为`X'01'`。 另外,我们也可以使用转义字符,例如在字符串中直接使用`\001`(在Unix/Linux环境中常用)或`\x01`,但SQL*Loader控制文件支持十六进制表示法。 因此,在控制文件中,我们可以这样写: FIELDS TERMINATED BY X'01' 注意:在控制文件中,我们还可以使用`OPTIONALLY ENCLOSED BY`等子句,但这里用户只关心分隔符。 下面是一个完整的控制文件示例,其中使用0x01作为字段分隔符: 示例控制文件(load.ctl): ``` LOAD DATA INFILE 'data.dat' -- 数据文件,内容以0x01分隔 BADFILE 'data.bad' -- 错误记录文件 DISCARDFILE 'data.dsc' -- 丢弃记录文件 APPEND INTO TABLE my_table -- 表名 FIELDS TERMINATED BY X'01' -- 关键:使用十六进制01作为分隔符 TRAILING NULLCOLS -- 允许末尾列为空 ( col1, col2, col3 DATE "YYYY-MM-DD", -- 日期类型需要指定格式 col4 ) ``` 运行命令: sqlldr userid=username/password@database control=load.ctl log=load.log 注意事项: 1. 数据文件中的字段分隔符必须是0x01字符。 2. 如果数据文件是在Windows上生成的,注意换行符可能是`\r\n`,而Unix/Linux上是`\n`。SQL*Loader默认能处理,但如果有特殊需求,可以使用`RECORD DELIMITED BY`子句。 另外,如果数据中包含0x01字符本身(作为数据的一部分),那么我们需要考虑转义,但SQL*Loader默认不支持转义分隔符。因此,通常需要确保数据中不包含分隔符。 如果用户需要处理数据中包含分隔符的情况,可能需要预处理数据(例如,使用其他字符转义)或者选择不会出现在数据中的分隔符。 根据引用[1]和[2]中的示例,我们也可以看到使用十六进制表示分隔符是可行的。 因此,我们给出的解决方案就是在`FIELDS TERMINATED BY`子句中使用`X'01'`。 下面再提供一个使用固定位置(而不是分隔符)的示例作为对比(引用[3]),但用户要求的是分隔符,所以这个只是作为参考。 引用[3]示例: ``` LOAD DATA INFILE 'c:/temp/demo10.dat' INTO TABLE emp REJECT ROWS WITH ALL NULL FIELDS ( empno POSITION(01:04) INTEGER EXTERNAL, ename POSITION(06:15) CHAR, ... ) ``` 但用户需要的是分隔符,所以我们不采用固定位置。 最后,生成相关问题。</think>### SQL*Loader 控制文件使用 0x01 作为分隔符的配置方法 在 SQL*Loader 控制文件中,使用十六进制值 `0x01`(ASCII SOH 字符)作为字段分隔符的配置示例如下: #### 控制文件示例(.ctl) ```sql LOAD DATA INFILE 'data.dat' -- 数据文件路径 BADFILE 'data.bad' -- 错误记录文件 DISCARDFILE 'data.dsc' -- 丢弃记录文件 APPEND INTO TABLE employees -- 目标表 FIELDS TERMINATED BY X'01' -- 关键配置:0x01 作为分隔符 TRAILING NULLCOLS -- 处理末尾空列 ( emp_id, name, hire_date DATE "YYYY-MM-DD", salary, dept_id ) ``` #### 关键配置说明: 1. **分隔符声明** `FIELDS TERMINATED BY X'01'` - `X'01'` 是十六进制表示法,对应 ASCII 的 SOH (Start of Heading) 字符 - 等效写法:`FIELDS TERMINATED BY 0x01`(部分 Oracle 版本支持) 2. **数据文件要求** 数据文件中的字段必须用 `0x01` 字符分隔,例如: `1001`<kbd>SOH</kbd>`John Doe`<kbd>SOH</kbd>`2023-01-15`<kbd>SOH</kbd>`75000`<kbd>SOH</kbd>`5` 3. **特殊字符处理** 若数据本身包含 `0x01` 字符: - 预处理数据:使用 `sed` 等工具转义(`sed -i 's/\x01/\\x01/g' data.dat`) - 或改用固定宽度格式(`POSITION` 子句)[^3] #### 执行命令 ```bash sqlldr userid=scott/tiger@db control=load.ctl log=load.log ``` #### 验证方法 检查日志文件: ```log Field Definitions for table EMPLOYEES: Column Name Position Len Term Encl Datatype ------------------------------ --------- ---- ---- --------------------- EMP_ID FIRST ? 01 CHARACTER NAME NEXT ? 01 CHARACTER HIRE_DATE NEXT ? 01 DATE YYYY-MM-DD SALARY NEXT ? 01 CHARACTER DEPT_ID NEXT ? 01 CHARACTER ``` ### 注意事项 1. **不可见字符处理** 在文本编辑器中 `0x01` 显示为空白或特殊符号,建议使用 `hexdump -C data.dat` 验证分隔符 2. **跨平台兼容性** Windows/Linux 换行符差异: ```sql RECORDS DELIMITED BY '\r\n' -- Windows RECORDS DELIMITED BY '\n' -- Linux/Unix ``` 3. **替代方案** 若无法直接生成 `0x01` 分隔符文件: ```bash # 将逗号转换为 0x01 awk -F, '{printf "%s\x01%s\x01%s\n", $1,$2,$3}' orig.csv > data.dat ``` > 通过 `X'hh'` 十六进制语法,SQL*Loader 支持任意 ASCII 字符作为分隔符[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值