[SQL 2000] 关于中文特殊汉字,SQL查不出来的怪问题?!!

risingsoft 2008-12-24 11:05:20
我数据库里有一个表,字段是varchar,当存的汉字带中文特殊符号比如:
cname='丿爺乄顁伱生死'

的时候,用SQL查询分析器,能查出来
select count(*) from table_role where cname='丿爺乄顁伱生死';

查的结果是1

但是在delphi的程序里,用adoconnection对象连接,用adoquery执行这个查询,就不好使:
select count(*) from table_role where cname='丿爺乄顁伱生死';

查的结果是0

why?如何解决?解决就给分......
...全文
353 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
risingsoft 2008-12-25
  • 打赏
  • 举报
回复
不加N一样没问题的。字段不是nvarchar,是varchar,当然里面存的是汉字

adoQry.close;
adoQry.SQL.Text := Fomat('select count(*) from table_role where cname = ''%s''',['丿爺乄顁伱生死']);
adoQry.open;
showmessage(inttostr(adoQry.fields[0].asinteger)); //显示0

adoQry.close;
adoQry.SQL.Text := Fomat('select count(*) from table_role where cname = ''丿爺乄顁伱生死''',[]);
adoQry.open;
showmessage(inttostr(adoQry.fields[0].asinteger)); //显示1
risingsoft 2008-12-25
  • 打赏
  • 举报
回复
不加N一样没问题的。字段不是nvarchar,是varchar,当然里面存的是汉字

adoQry.close;
adoQry.SQL.Text := Fomat('select count(*) from table_role where cname = N''%s''',['丿爺乄顁伱生死']);
adoQry.open;
showmessage(inttostr(adoQry.fields[0].asinteger)); //显示0

adoQry.close;
adoQry.SQL.Text := Fomat('select count(*) from table_role where cname = N''丿爺乄顁伱生死''',[]);
adoQry.open;
showmessage(inttostr(adoQry.fields[0].asinteger)); //显示1
lzd1_83 2008-12-25
  • 打赏
  • 举报
回复
select count(*) from table_role where cname = ‘N'
  • 打赏
  • 举报
回复
数据库中该字段是nvarchar?
水族杰纶 2008-12-25
  • 打赏
  • 举报
回复
使用 Unicode 資料
Unicode 規格為全世界各行各業廣泛使用的字元定義單一的編碼架構。所有電腦都以一致的方式將 Unicode 資料的位元模式以一個 Unicode 格式轉換成字元。這樣一來,同一個位元模式在所有電腦上都一定會轉換成同一個字元。資料可以自由地從一個資料庫或電腦轉換到別的資料庫或電腦,不須擔心接收系統會將位元模式轉換成錯誤的字元。

只用 1 個位元為字元編碼的資料型別有一個問題,那就是該資料型別只能代表 256 個不同的字元。使得不同字母 (如歐洲字母) 必須採用不同的編碼規格 (或字碼頁),這樣的數量相當少,也不可能處理動輒數以千計的字母系統,如日文漢字或韓文拼音字母。

每個 Microsoft® SQL Server™ 定序都有一個字碼頁 (Code Page),定義哪些位元模式分別代表 char、varchar與 text 值中的每個字元。不同資料行與字元常數可以指派為不同的字碼頁。用戶端電腦使用與作業系統地區設定相關的字碼頁來解譯位元模式。不同的字碼頁有很多。有些字元只出現在某些字碼頁,在別的字碼頁中就沒有。有些字元在某些字碼頁中定義為某個位元模式,在其他字碼頁中又定義為另一種位元格式。當您在建立必須處理不同語言的國際系統時,很難為所有電腦挑選符合多國需求的字碼頁。也很難確保每部電腦在與使用不同字碼頁的系統中溝通時能夠執行正確的轉換。

Unicode 規格以 2 位元組為每個字元編碼,來解決這個問題。採用 2 個位元組的規格可以有足夠的不同模式 (65,536) 來涵蓋大部分的商用語言。因為所有 Unicode 系統都以一致的方式使用相同的位元模式來代表所有字元,所以將字元移到別的系統時,沒有轉換錯誤的問題。只要整個系統都使用 Unicode 資料型別,就可以將字元轉換問題減到最少。

在 Microsoft SQL Server 中,以下資料型別支援 Unicode 資料:

nchar


nvarchar


ntext


附註 這些資料型別開頭的 n 是代表國際 (Unicode) 資料型別的 SQL-92 標準。

使用 nchar、 nvarchar 與 ntext 分別相當於使用 char、varchar 與 text,只不過:

Unicode 支援的字元範圍較廣。


儲存 Unicode 字元所需的空間較多。


nchar 與 nvarchar 資料行的最大大小是 4,000 個位元組,不同於 char 與 varchar 的 8,000 個位元組。


指定 Unicode 常數前面要以 N 開頭:N'A Unicode string'。


所有 Unicode 資料使用相同的 Unicode 字碼頁。定序不會控制 Unicode 資料行所用的字碼頁,而只控制諸如比較規則與是否區分大小寫等屬性。
ws_hgo 2008-12-24
  • 打赏
  • 举报
回复
unicode编码
varchar()为非unicode编码nvarchar为unicode编码
如果字段类型为varchar
查询的时候加上N'字段名'

你上面如果不是这个问题的话就是dephi 的问题了
dawugui 2008-12-24
  • 打赏
  • 举报
回复
看来这个是开发语言delphi的问题了,帮顶.
risingsoft 2008-12-24
  • 打赏
  • 举报
回复
adoQry.close;
adoQry.SQL.Text := Fomat('select count(*) from table_role where cname = ''丿爺乄顁伱生死''',[]);
adoQry.open;
showmessage(inttostr(adoQry.fields[0].asinteger)); //显示1
risingsoft 2008-12-24
  • 打赏
  • 举报
回复
奇怪了,我这么写为什么不行?

adoQry.close;
adoQry.SQL.Text := Fomat('select count(*) from table_role where cname = N''%s''',['丿爺乄顁伱生死']);
adoQry.open;
showmessage(inttostr(adoQry.fields[0].asinteger)); //显示0

adoQry.close;
adoQry.SQL.Text := Fomat('select count(*) from table_role where cname = N''丿爺乄顁伱生死''',[]);
adoQry.open;
showmessage(inttostr(adoQry.fields[0].asinteger)); //显示1

why?道理?
dawugui 2008-12-24
  • 打赏
  • 举报
回复
在字符串前面加个N试试.

select count(*) from table_role where cname = N'丿爺乄顁伱生死'; 
dawugui 2008-12-24
  • 打赏
  • 举报
回复
select count(*) from table_role where cname = N'丿爺乄顁伱生死'; 

本书是Inside Microsoft SQL Server 2005系列四本著作中的一本。它详细介绍了T-SQL的内部体系结构,包含了非常全面的编程参考,提供了使用Transact-SQL(T-SQL)的专家级指导,囊括了非常全面的编程参考,揭示了基于集合的询的强大威力,并包含大量来自专家们的参考和建议。本书适合专业数据库开发者、BI开发者、DBA和以SQL Server作为后台数据库的一般应用程序开发者,读者可以通过书中的最佳实践、高级技巧和代码示例来掌握这门复杂的编程语言,以切合实际的方案来解决复杂的实际问题。   深入理解T-SQL体系结构,充分利用高级T-SQL询技术。   本书深入介绍了T-SQL的内部体系结构,揭示了基于集合的询的强大威力,并包含大量来自专家们的参考和建议。通过本书提供的最佳实践和示例代码,数据库开发人员和管理员完全可以掌握这门复杂的编程语言,以切合实际的方案来解决复杂的实际问题。通过本书,你将学习到如何:理解逻辑和物理的询处理;使用方法论优化询;在询中用TOP选项修改数据;用递归逻辑、具体化路径或嵌套集合解决方案特殊的数据结构;通过逻辑难题提高你的逻辑能力并掌握问题的核心等。   你将学习到如何:   理解逻辑和物理的询处理;   使用方法论优化询;   解决关系分区问题;   使用CTE和排名函数简化及优化解决方案;   用各种技术聚合数据,包括附加属性、旋转、直方图和分组因子;   在询中用TOP选项修改数据;   用递归逻辑、具体化路径或嵌套集合解决方案特殊的数据结构;   通过逻辑难题提高你的逻辑能力并掌握问题的核心; 内容简介 本书是Inside Microsoft SQL Server 2005系列四本著作中的一本。本书及其续篇——《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》介绍了SQL Server 2005中高级T-SQL询、询优化及编程相关的知识。这两本书侧重于解决实践中的常见问题,并讨论了解决这些问题的方法。它们将向你揭示基于集合(set-based)询的强大威力,并解释为什么它比使用游标的过程化编程(procedural programming)更具优势。同时,它还会教你识别使用基于游标解决方案与基于集合解决方案的优劣。   书中还讲述了其他几种争议较多的构造(camstruct)——如临时表、动态执行、XML和.NET集成——它们在具有强大功能的同时,也具有极大的风险。   本书适合于需要编写或检T-SQL代码的有经验的T-SQL程序员和数据库专业人员。读者可从中学到大量精湛的技巧,这些技巧会充实您的工具箱和编码技能,并让您顺利地开发出高效的解决方案。 作者简介 Itzik Ben-Gan是Solid Quality Learning的首席导师和创始人。他从1999年开始便一直是SQL Server方面的Microsoft MVP,在世界各地讲授 T-SQL询、编程和询优化相关的课程,并提供相关咨询服务。他在SQL Server Magazine和MSDN上发表了多篇文章,并被邀请在许多专题会议上做过报告,包括TechEd、DevWeek、PASS和SQL Server Connections。 目录 序 前言 致谢 引言  本书的组织  系统要求  安装示例数据库  更新  代码示例  本书支持 第1章 逻辑询处理  逻辑询处理中的各个阶段   逻辑询处理阶段简介  Customers/Orders场景下的示例询  逻辑询处理步骤详解   步骤1:执行笛卡尔乘积(交叉联接)   步聚2:应用ON筛选器(联接条件)   步骤3:添加外部行(Outer Row)   步骤4:应用WHERE筛选器   步骤5:分组   步骤6:应用CUBE或ROLLUP选项   步骤7:应用HAVING筛选器   步骤8:处理SELECT列表   步骤9:应用DISTINCT子句   步骤10:应用ORDER BY子句   步骤11:应用TOP选项  SQL Server 2005中新的逻辑处理阶段   表运算符   OVER子句   集合操作  结论 第2章 物理询处理  询处理期间的数据流  编译   Algebrizer   优化   使用询计划   更新计划  结论   致谢 第3章 询优化  本章用到的示例数据  优化方法论   分析实例级的等待   联系等待和队列   确定方案   细化到数据库/文件级别   细化到进程级别   优化索引/询  询优化工具   syscacheobjects   清空缓存   动态管理对象   STATISTICS IO   测量询的运

34,875

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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