postgresql导入,invalid byte sequence for encoding “UTF8“:0x96

目录

概述

实现

思考

代码

遇到的问题

解决方法


概述

近期按业务要求做个迁移某些基础表的小工具(例如人员、角色、菜单、流程等表),业务要求弄个java GUI可视化界面(连接要可配置、迁移表要可配置),支持源库(mysql、oracle、高斯)迁移到目标高斯库,网上有很多现成的工具是可以做到的,但既然业务说要弄那就弄个呗。

实现

因为基础表数据量不大,所以我的实现思路是:

  1)从源库导出txt

  2)将txt文本通过postgrsql的copymanager方法以流的方式导入到目标库

思考

为啥要分成两步?明明可以一次查询源库然后循环数据插入目标库的。

答:其实,一,是为了方便以后需求扩展,拆分成两步更灵活。二,是用流的方式入库更快更高效。

代码

1)导出txt这个就不用说了,你可以sqldr命令导出txt,椰可以纯jdbc方式查询源库并依次写入txt

2)流的方式导入,这个我前面的文章是有提到怎么做(PostgreSQL或高斯批量导入,序号自增)

遇到的问题

前面扯了那么多其实都不是我这次要说的,哈哈,导入的时候遇到问题了:

invalid byte sequence for encoding "UTF-8":0x96

这个错折磨了我很久,网上百度到的都是答非所问。报这个错是因为一行数据:

1@2219000\22631535@测试嘎嘎@x省万达广场13-17号@0519-6666@1@20230825

'@'是我的分隔符,这行数据出错是有个‘\’反斜杠,导致导入的时候转义啥的。

解决方法

首先说下我的方法能解决我的,不一定能解决你的,别骂我/(ㄒoㄒ)/~~

br = new BufferedReader (new InputStreamReader(new FileInputStream("/home/test/test.txt"),"UTF-8"));
 
copyManager.copyIn("COPY "+tablename + " FROM STDIN delimiter as '@' NULL as 'null' encoding 'utf8' escape '\\' csv header",br);

escape '\\' csv header ,escape的意思是当作普通字符,将反斜杠当作普通字符导入就行了,至于csv header,那是因为要用escape就必须是csv mode,加上就行了,即使导入文件是txt文本也不影响。

<think>好的,我需要帮助用户解决在通过psql执行SQL文件遇到的编码不匹配错误,具体是GBK和UTF8之间的转换问题。首先,我得回顾一下用户提供的引用内容,看看有没有相关的线索。 用户提供的四个引用都是关于PostgreSQL连接错误的解决方法,比如服务器没有运行或者套接字文件不存在的问题。这些可能和当前的编码问题没有直接关联,但或许在排查过程中可以结合这些信息。例如,如果服务器未正确启动,可能会有其他错误,但用户现在明确提到的是编码问题,所以重点应放在编码转换上。 首先,我需要确认用户遇到的错误信息是什么样子的。通常,当psql执行SQL文件出现编码不匹配,错误信息会类似于“ERROR: invalid byte sequence for encoding "UTF8": 0x...”或者类似的提示,指出在转换出现了无效的字节序列。用户提到的是score/sirs.sql执行失败,可能是因为该文件保存为GBK编码,而数据库使用的是UTF8,或者相反。 解决方案通常包括以下几个步骤: 1. **确认数据库编码**:用户需要检查当前数据库编码设置。可以使用`\l`命令在psql中查看数据库列表及其编码。例如,执行`\l database_name`来查看特定数据库编码。 2. **确认SQL文件的编码**:在Linux系统中,可以使用`file`命令或者`enca`工具来检测文件的编码。例如,`file score/sirs.sql`或者`enca score/sirs.sql`。如果文件是GBK编码,而数据库UTF8,则需要转换文件编码。 3. **转换文件编码**:使用`iconv`工具将文件从GBK转换UTF8。例如,`iconv -f GBK -t UTF-8 score/sirs.sql -o score/sirs_utf8.sql`。转换后,使用新生成的文件导入。 4. **指定客户端编码**:在psql命令中通过设置客户端编码参数来覆盖默认设置。例如,`psql --set=client_encoding=GBK -f score/sirs.sql`或者`PGCLIENTENCODING=GBK psql -f score/sirs.sql`。这可能解决部分转换问题,但需要注意数据库实际使用的编码。 5. **修改数据库编码**:如果长期需要处理不同编码的数据,可能需要调整数据库编码设置。但修改数据库编码比较复杂,通常需要重新建库,使用正确的编码。例如,创建数据库指定编码:`CREATE DATABASE dbname ENCODING 'GBK';`。不过,这需要评估是否会影响现有数据。 6. **处理转义字符或非法字符**:有候文件中可能包含无法转换的字符,需要手动清理或者使用工具如`sed`进行替换。例如,查找并替换非法字符。 接下来需要考虑用户可能的操作环境。用户可能在Linux系统下,使用命令行工具处理。因此,给出的解决方案需要适用于Linux环境,并给出具体的命令示例。 另外,需要注意权限问题,例如是否有权限执行iconv,或者写入转换后的文件。同转换后的文件可能需要检查是否正确,避免转换过程中出现错误导致数据丢失。 可能还需要提醒用户在导入前备份原始文件,以防万一。此外,如果SQL文件包含特定的字节序列,可能在转换后仍存在问题,需要进一步处理。 最后,总结解决方案的步骤,确保用户能够一步步跟随操作,解决编码问题。同,生成相关问题,帮助用户深入理解可能遇到的其他问题。</think>### 解决psql执行SQL文件编码不匹配问题 #### 1. **确认数据库编码** 在psql中执行以下命令查看当前数据库编码: ```sql \l 你的数据库名 ``` 例如输出中包含`Encoding: UTF8`,说明数据库使用UTF8编码[^1]。 #### 2. **检查SQL文件编码** 在Linux终端使用`file`命令检测文件编码: ```bash file score/sirs.sql ``` 如果输出显示`ISO-8859`或`GBK`,则需转换编码。 #### 3. **转换文件编码** 使用`iconv`工具将文件从GBK转为UTF-8: ```bash iconv -f GBK -t UTF-8 score/sirs.sql -o score/sirs_utf8.sql ``` 转换后使用新文件执行: ```bash psql -U 用户名 -d 数据库名 -f score/sirs_utf8.sql ``` #### 4. **指定客户端编码** 在psql命令中强制指定客户端编码为GBK: ```bash PGCLIENTENCODING=GBK psql -U 用户名 -d 数据库名 -f score/sirs.sql ``` 或使用参数: ```bash psql --set=client_encoding=GBK -U 用户名 -d 数据库名 -f score/sirs.sql ``` #### 5. **修改数据库编码(谨慎操作)** 若需长期兼容GBK,可新建数据库并指定编码: ```sql CREATE DATABASE 新数据库ENCODING 'GBK'; ``` **注意**:此操作需重新导入数据,且可能影响现有应用兼容性[^2]。 #### 6. **处理非法字符** 若转换后仍有错误,检查文件中的特殊字符: ```bash grep -nP '[\x80-\xFF]' score/sirs_utf8.sql ``` 使用`sed`或手动编辑文件替换非法字符。 --- ### 关键操作验证 - **编码转换验证**:转换后使用`file score/sirs_utf8.sql`确认输出为`UTF-8`。 - **执行测试**:先执行部分SQL语句验证是否报错。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值