`
fenshen6046
  • 浏览: 52442 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

生产环境下 数据库乱码

阅读更多
背景:
数据库的client,connection等编码都是latin1,表的编码是utf-8.
开发环境是eclipse,默认编码是utf8.
这种方式下在linux命令行下获取中文数据正常,但是java的jdbc获取数据是乱码。(以前是用c获取的数据,现在要改成java获取数据)


在java的jdbc中假设获取数据sql 为select field from table ;乱码
可以修改sql语句为
select convert(unhex(hex(convert(field  using latin1))) using utf8) as content from table;
这样就可以正常显示。
同样如果你的生产库也是乱码同样可以用这个方法获取正常编码。(编码方式根据生产库修改)。

好,第一步解决了。可问题是,我们这的库很多,而且还是分布式的,并且字段也很多。不可能在写sql的时候每个字段都加上这个转化器。所以可否将这个转化放到java中。


于是从网上找来了字符串转化为16进制以及16进制转化为字符串方法:
private static String hexString = "0123456789ABCDEF";

	/*
	 * 将字符串编码成16进制数字,适用于所有字符(包括中文)
	 */
	public static String encode(String str) throws Exception {
		// 根据默认编码获取字节数组
		byte[] bytes = str.getBytes("utf-8");
		StringBuilder sb = new StringBuilder(bytes.length * 2);
		// 将字节数组中每个字节拆解成2位16进制整数
		for (int i = 0; i < bytes.length; i++) {
			sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
			sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
		}
		return sb.toString();
	}

	/*
	 * 将16进制数字解码成字符串,适用于所有字符(包括中文)
	 */
	public static String decode(String bytes) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream(bytes.length() / 2);
		// 将每2位16进制整数组装成一个字节
		for (int i = 0; i < bytes.length(); i += 2)
			baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString.indexOf(bytes.charAt(i + 1))));
		return new String(baos.toByteArray());
	}

自己又写了个convert方法:
	/** 转化 */
	private static String convert(String str, String fromCharset, String charset) throws Exception {
		return new String(str.getBytes(fromCharset), charset);
	}

由于latin1对应的编码为ios-8859-1,但是此编码缺失字符较多。所以使用 Windows-1252编码。
(此处普及下编码没一种编码实际上对应的是一个矩阵中的内容,即这个矩阵有内容的就可以正确解析为字符,如果没有则解析失败关于ios-8859-1和Windows-1252的编码情况以及范围可以参考一下http://en.wikipedia.org/wiki/Windows-1252 和http://en.wikipedia.org/wiki/ISO/IEC_8859-1 )
执行下
convert(decode(encode(convert(a, "utf8", "utf8"))), "Windows-1252", "utf8")

来对比下结果
百姓身边:北京市出台全国首个职工发展五年规划,明确提出反对任何形式的就业歧视,有关编制内外同工不同酬造成的不公平现象,有望3年内得到遏制.

百姓身边:北京市出�?�全国首个�?�工�?�展五年规划,明确�??出�??对任何形�?的就业歧视,有关编制内外�?�工�?�?�酬造�?的�?公平现象,有望3年内得到�??制.


根据上面的情况进行转化吧。
结果还算乐观,但是由于编码的有些位缺失,所以还是有部分乱码。所以下一步就是看那种编码能更全面的包括所以字符。
分享到:
评论

相关推荐

    SQL-SERVER-64位配置ORACLE连接-中文乱码问题

    3. **安全考虑**:在生产环境中,应避免使用默认的NLS_LANG值,以防安全漏洞。 #### 五、总结 通过上述步骤,可以有效地解决64位系统下SQL Server连接Oracle数据库时遇到的中文乱码问题。关键在于确保客户端和...

    AIX和WINDOWS下DB2数据库互导

    这种问题在项目实践中尤为突出,特别是当需要在非生产环境(如Windows)中模拟生产环境(如AIX)的数据时。因此,我们需要一种方法来实现AIX和Windows之间的DB2数据互导。 互导的过程主要包括以下几个步骤: 1. **...

    解决开发中乱码方案

    这里使用的是`gb2312`编码,适用于中文环境下的表单提交。 #### 方法二:修改Tomcat配置文件 1. **Server.xml文件修改**: - 需要在Tomcat服务器的`server.xml`文件中添加或修改`URIEncoding`属性,以确保URL中的...

    使用plsqldev对oracle数据库做备份还原操作

    5. 对于生产环境,建议在非工作时间进行备份和还原,以减少对业务的影响。 总的来说,PL/SQL Developer提供了一种直观且高效的方式来进行Oracle数据库的备份和还原,对于数据库管理员来说,这是一个非常有价值的...

    mysql中文乱码解决

    ### MySQL中文乱码解决方案 ...如果是部署到生产环境中,建议采用第二种方法调整`my.ini`配置文件或第四种方法修改系统配置文件,确保所有数据库都使用统一的字符集设置,从而避免后续可能出现的乱码问题。

    argis10.2.2乱码补丁.rar

    .cpg文件是Esri为ArcGIS提供的一个配置文件,用于指定数据库的字符集,确保数据正确显示。但是,每次打开属性表都要手动添加或设置.cpg文件,显然降低了工作效率。 为了解决这一问题,开发人员推出了"argis10.2.2...

    解决了乱码问题的JInitiator 1.3.1.21

    2. **测试环境**:最好在非生产环境先行测试新版本,确认无误后再推广到生产环境。 3. **文档查阅**:查阅官方发布的更新日志或发布说明,了解新版本的具体改进和已知问题。 4. **系统配置**:根据新的版本要求,...

    MySQL数据库安装文档.zip

    通常会包括选择安装类型(如默认的“Developer Default”或“Server Only”)、设置安装路径、配置服务器类型(如开发机、生产环境)等。 4. **服务配置**:在安装过程中,需要配置MySQL服务器的启动账户、端口、...

    Informix数据库导入sqlserver数据库指南

    1. **从生产环境(Informix)导出数据至测试环境(Informix)**:确保数据准确性与安全性。 2. **测试环境(Informix)数据导入到Windows版Informix**:为后续的导入做好准备。 3. **通过ODBC连接Windows版Informix...

    MySQL 远程访问及中文乱码问题

    修改数据库配置和权限可能会影响系统的稳定性和安全性,因此在操作前建议备份重要数据,并在非生产环境中测试。对于远程访问,务必限制只允许特定 IP 或 IP 范围连接,以防止不必要的安全风险。 在源码层面,如果你...

    58数据库设计军规

    线上环境、开发环境、测试环境数据库内网域名遵循命名规范** - **解读**:规范化的命名规则有助于清晰地区分不同环境下的数据库资源,便于管理和维护。例如,通过“dj.xxx.db”、“dj.xxx.rdb”和“dj.xxx.tdb”等...

    mysql数据库设计规范.docx

    - 禁止在线上环境进行压力测试,也不应直接从开发或测试环境连接生产环境数据库。 这些规范遵循了最佳实践,有助于提升数据库的性能和可维护性,避免潜在的问题和瓶颈。在设计数据库时,应始终牢记这些原则,以...

    jsp页面连接数据库

    - **异常处理**:虽然示例中使用`System.out.println(e)`来输出异常信息,但在实际生产环境中,应当采用更完善的日志记录机制,并对用户友好的错误提示。 - **资源管理**:确保所有打开的资源都能被适当地关闭,以...

    DB2 jar包和连接DB2数据库代码

    10. **监控与维护**:在生产环境中,监控DB2数据库的性能和健康状态是必要的。IBM提供了DB2监控工具,可以帮助开发者分析数据库负载,定位性能瓶颈。 总之,使用DB2的JDBC驱动和对应的连接代码,开发者可以轻松地在...

    生成数据库表insert语句脚本

    - **测试环境准备**:在开发和测试环境中,复制生产环境的数据可以帮助模拟真实情况。 - **代码版本控制**:对于重要的数据,将其作为代码存储,便于版本管理和跟踪。 3. **生成方法**: - **手动编写**:对于...

    JForum 2.1.8 中文乱码问题

    4. 确保环境一致性:确保开发、测试和生产环境的字符编码保持一致,避免在不同环境间迁移数据时出现乱码。 四、实践与总结 解决JForum 2.1.8中文乱码问题需要对软件的运行环境有深入了解,包括Web服务器、数据库...

    解决Linux下Tomcat向MySQL插入数据中文乱码问题

    - 在进行跨平台部署时,必须确保所有环境下的字符编码一致性,包括开发环境、测试环境和生产环境。 - 对于Web应用,确保服务器(如Tomcat)和Web框架(如SSM)的字符编码配置正确,特别是过滤器设置,以处理HTTP请求...

    mysql中文乱码解决方案

    ### MySQL中文乱码解决方案 在使用MySQL数据库的过程中,可能会遇到中文显示乱码的问题。中文乱码问题通常是由于字符集...需要注意的是,在实际操作过程中应谨慎修改配置,尤其是在生产环境中,避免造成不必要的影响。

    pymysql python连接mysql数据库

    - 在生产环境中,确保妥善管理数据库连接,避免资源泄露。 - 性能优化方面,可以考虑使用连接池来复用数据库连接。 - 考虑到安全,不要在代码中硬编码数据库凭证,而是使用环境变量或配置文件。 综上所述,PyMySQL...

Global site tag (gtag.js) - Google Analytics