我们公司的构建过程使用gradle并将包括sql文件在内的可交付成果复制到共享驱动器。 Unix框可以引用这些路径,然后使用shell脚本。 shell脚本调用db2命令行实用程序在相应环境的数据库中运行sql文件。
这非常有效。但是我已经碰到了我们正在更新sql文件中的日文字符的墙。当我从浏览器下载文件并检查文件时,我可以正确地看到字符。但是,在unix框中,我可以看到sql文件中的内容看起来非常不同。我用cat,more和vi来查看文件的内容。 LANG环境变量的值是C.我看到环境变量集是TERM = XTERM。所以我认为xterm是终端评估者。
LANG=C
当我在linux终端窗口中运行命令时 -
locale charmap
我将编码视为ANSI_X3.4-1968。 UTF-8是其中一种可能性,但我认为它没有设置在框中。
当我在linux终端中运行命令时 -
file -bi 1.sql
我将文件的charset编码视为UTF-8。
当我们运行调用db2命令行实用程序的shellscript时,它会插入我在unix文件中看到的内容而不是实际的日文字符。
我尝试搜索可能出错的选项。请在下面找到我的分析 -
当我从Aqua Data Studio运行sql时,数据被正确插入。因此,实际的数据库设置或表配置没有问题。
共享路径中还有一些其他xml文件有日文字符。在unix框中,我再次看到sql文件中看到的扭曲字符。当这些xml文件被复制到报告服务器时,它们工作正常,数据在pdf中正确显示。
所以我的想法是,我可以通过某种方式在db2命令行实用程序中指定使用正确的字符集,这应该可以正常工作。但我无法在互联网上找到任何有用的东西。
现在有可能存在一些我无法弄清楚的小事。因此,我会请求你在这方面帮助我。这不是非常关键,因为我们总是可以离开自动部署和sql插入过程,而是通过将脚本提供给DBA来进行手动插入。然而,这是非常沮丧的。
如果你能帮我这方面,请告诉我。仅供参考,我解压缩了gradle构建后产生的战争(来自jenkins服务器)。我可以在记事本++中正确地看到文件。如果您需要任何其他信息,请告诉我。
答案 0 :(得分:0)
如果日语字符在终端窗口的cat
或more
中无法正确呈现,则表示LANG变量设置错误。在您的情况下,LANG = C不适合Unicode。
某些终端模拟器(如Putty)需要将翻译集设置为支持UTF-8,并且可能不是默认值 - 否则Unicode字符可能会在屏幕上呈现错误。
正确的LANG设置取决于您所在的国家/地区,Linux上安装的语言环境,以及目标数据库区域和代码页以及Db2服务器操作系统(即Z / OS或i系列的Db2,或者的Linux / Unix / Windows)中。有时,如果默认情况下未安装其他语言环境,则必须安装其他语言环境,这取决于您的Linux发行版,平台以及版本和安装策略。
解决方案通常是确保在连接到任何Db2数据库之前正确设置LANG变量。在由脚本自动运行的配置检查中断言这些事情是明智的。您可以从Db2文档中获取LANG的正确值,这取决于您的Db2服务器操作系统和版本以及您对目标数据库编码和区域(或目标数据库/表/列/表空间的CCSID等)的了解。例如,如果您的Db2数据库位于Linux / Unix / Windows上,请查看此page。对于Z / OS或i-series,存在Db2的其他页面。
更改LANG变量(导出LANG = ...)后,再次验证more
或cat
是否正确呈现日文字符。如果已连接到数据库,则更改LANG无效,请记住先断开连接。测试LANG值,直到日文字符看起来正确,然后尝试Db2连接并检查新行为。