在sql server2008中导出utf8格式的文件

花如月 2011-03-02 11:09:08
在sql server2008中用bcp命令导出utf8格式的文件,具体格式要怎么写?
要求:
1.sql server2008环境下;
2.产生的文件时select的结果;
3.使用bcp命令;
4.不使用bcp命令也可以,但是要提供相关可行性的方法,不需要编程序;


请各位大侠多多指教啊
...全文
1059 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Linares 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 feilniu 的回复:]

引用 19 楼 linares 的回复:

如果方便,发2005版的bcp.exe给我,我测试一下是否SQLNCI的问题。

linares@126.com

thanks


已发。
[/Quote]

测试结果知会一声,缺少sqlncli.dll出错,就不再测试了,应该是接口版本的问题,08的是sqlncli10.dll。
SQL Server Native Client 10.0 版本不支持 UTF-8 编码(代码页 65001)
花如月 2011-03-09
  • 打赏
  • 举报
回复
php处理转换成utf8格式的代码
花如月 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 feilniu 的回复:]

引用 2 楼 salley_2010 的回复:

导出后怎么转换呢?只要不是手动去另存为就好,编程就好不要


如果只是编码转换,基本不需要编程。用脚本语言就是一两个命令的事。
比如把UCS-2LE编码(即Windows默认的little-endian的Unicode编码)的文件转换成UTF-8编码的文件:
python -c "open('zh_utf8.txt','w',enc……
[/Quote]

跪求代码:
feilniu 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 salley_2010 的回复:]

我专门试了一下,结果是:
我用-w用bcp导出为unicode编码的txt文档,结果用php处理之后输出结果成乱码,这时候看格式是ANSI格式的;但是如果我手动另存为utf8格式的,用php处理之后就是utf8格式的,不会乱码;
我还试了一下用bcp -c导出为ANSI格式的,结果用php处理之后不会乱码,还是ANSI格式的,但是再使用就会有问题
[/Quote]

LZ所说的ANSI格式,应该是指GBK编码。如果文件中不包含某些Unicode特殊符号,通常的中文字符GBK编码都是支持的。
PHP肯定是支持对GBK、UTF-8、UCS-2之种字符编码的处理。LZ还是花点工夫去查一下相关资料。
花如月 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 linares 的回复:]

引用 10 楼 salley_2010 的回复:
有点不太明白你的意思,我也去网上查了一下,知道了little endian,但是这和我通过php处理之后更换编码格式有什么关系?能不能说的详细一点?


不清楚你PHP怎么处理的,不过,双字节编码必然存在高低字节顺序先后的问题,也就是 big/little endian,你认为有没有什么关系呢?
[/Quote]
我知道你说的高低字节顺序先后的问题,我用php处理的时候是就是截取然后循环处理,生成文档,奇怪的是读取的txt文档为utf8格式的,用php处理之后就是utf8格式的,如果是ANSI格式的,用php处理也还是ANSI格式的,如果是unicode编码的txt文档,结果用php处理之后就乱码了;
这和little endian有什么关系呢?我一直不是很清楚
feilniu 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 linares 的回复:]

如果方便,发2005版的bcp.exe给我,我测试一下是否SQLNCI的问题。

linares@126.com

thanks
[/Quote]

已发。
花如月 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 feilniu 的回复:]

bcp命令最后加上:-C 65001
不过这种方式导出的UTF-8文本文件不带BOM。
[/Quote]SQL Server2008不支持utf8,-C 65001 试过了,不行的
feilniu 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 salley_2010 的回复:]

导出后怎么转换呢?只要不是手动去另存为就好,编程就好不要
[/Quote]

如果只是编码转换,基本不需要编程。用脚本语言就是一两个命令的事。
比如把UCS-2LE编码(即Windows默认的little-endian的Unicode编码)的文件转换成UTF-8编码的文件:
python -c "open('zh_utf8.txt','w',encoding='utf-8').write(open('zh_ucs.txt',encoding='utf-16le').read())"
命令中的zh_ucs.txt和zh_utf8.txt分别替换成源文件和目标文件即可。用批处理是很简单的事情。

况且,LZ用的PHP也肯定支持这几种常见字符编码的转换。
Linares 2011-03-09
  • 打赏
  • 举报
回复
如果方便,发2005版的bcp.exe给我,我测试一下是否SQLNCI的问题。

linares@126.com

thanks
Linares 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 feilniu 的回复:]

环境:
Windows 2003 sp2
SQL Server 2005 (9.0.3080+)

p.s. 我这边的联机丛书中,没有看到你的“重要提示”。
[/Quote]

哦,难怪,我的是 Win7+2008。

看了MSDN,2005没有这个“重要提示”,但是2008/2008R2都有这个提示,2008R2没装,2008测试过确实不支持65001。

为什么高版本反而不支持了呢,困惑中。
feilniu 2011-03-09
  • 打赏
  • 举报
回复
随便找个数据量不大的包含中文信息的表:
bcp dbname.dbo.tablename out tablename.txt -c -S serverip -U uid -P pswd -C 65001
结果tablename.txt是一个UTF-8编码、不带BOM、DOS风格换行符的文本文件。

环境:
Windows 2003 sp2
SQL Server 2005 (9.0.3080+)

p.s. 我这边的联机丛书中,没有看到你的“重要提示”。
Linares 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 salley_2010 的回复:]
有点不太明白你的意思,我也去网上查了一下,知道了little endian,但是这和我通过php处理之后更换编码格式有什么关系?能不能说的详细一点?
[/Quote]

不清楚你PHP怎么处理的,不过,双字节编码必然存在高低字节顺序先后的问题,也就是 big/little endian,你认为有没有什么关系呢?
Linares 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 feilniu 的回复:]

bcp命令最后加上:-C 65001
不过这种方式导出的UTF-8文本文件不带BOM。
[/Quote]

-C code_page 
特定的代码页编号,例如 850。

重要提示:
SQL Server 不支持代码页 65001(UTF-8 编码)


不过,既然连“不带BOM”这种细节你都那么清楚,可见你成功测试过,麻烦写一个demo让我测试一下,谢谢。
feilniu 2011-03-09
  • 打赏
  • 举报
回复
LZ不想编程,这没错。偷懒是程序员的美德。
但如果连学习新事物的热情和耐心都没有,就麻烦了。
feilniu 2011-03-09
  • 打赏
  • 举报
回复
bcp命令最后加上:-C 65001
不过这种方式导出的UTF-8文本文件不带BOM。
花如月 2011-03-09
  • 打赏
  • 举报
回复
我最后两条跟贴的问题,在没有人回答我就要结贴了,等的花儿都谢了
花如月 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 linares 的回复:]

引用 4 楼 salley_2010 的回复:

我专门试了一下,结果是:
我用-w用bcp导出为unicode编码的txt文档,结果用php处理之后输出结果成乱码,这时候看格式是ANSI格式的;但是如果我手动另存为utf8格式的,用php处理之后就是utf8格式的,不会乱码;
我还试了一下用bcp -c导出为ANSI格式的,结果用php处理之后不会乱码,还是ANSI格式的,但是再使用就……
[/Quote]

有点不太明白你的意思,我也去网上查了一下,知道了little endian,但是这和我通过php处理之后更换编码格式有什么关系?能不能说的详细一点?
花如月 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wxf163 的回复:]

既然编程

那你就复杂点编

绕过bcp ,直接用select 语言查询啊。

引用 6 楼 salley_2010 的回复:
问题是文件太多了,几百个文件怎么受得了?我是使用sql编程循环产生txt文件的,太头疼了!
[/Quote]
要保存搜索结果产生文件的,结合select导出文件的命令只有bcp吧,这怎么绕过呢?
风驰天下丨 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 salley_2010 的回复:]
我专门试了一下,结果是:
我用-w用bcp导出为unicode编码的txt文档,结果用php处理之后输出结果成乱码,这时候看格式是ANSI格式的;但是如果我手动另存为utf8格式的,用php处理之后就是utf8格式的,不会乱码;
我还试了一下用bcp -c导出为ANSI格式的,结果用php处理之后不会乱码,还是ANSI格式的,但是再使用就会有问题
[/Quote]
挺。。。
Linares 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 salley_2010 的回复:]

我专门试了一下,结果是:
我用-w用bcp导出为unicode编码的txt文档,结果用php处理之后输出结果成乱码,这时候看格式是ANSI格式的;但是如果我手动另存为utf8格式的,用php处理之后就是utf8格式的,不会乱码;
我还试了一下用bcp -c导出为ANSI格式的,结果用php处理之后不会乱码,还是ANSI格式的,但是再使用就会有问题
[/Quote]

应该是BOM的问题,头两个字节: FFFE --> little endian
加载更多回复(7)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧