2024年1月20日发(作者:)
在SQLServer中插入或更新数据出现乱码或问号的解决方法
问题描述:
在SQLServer中使用SQL语句插入或更新数据出现乱码或问号,或在SQL语句的where中使用like模糊匹配查询查不出数据,但在like后面的模糊匹配的内容前加上N就可查询出数据的问题。
(1) 在用SQL语句插入中文时出现问号,如下图:
(2) 用SQL语句更新数据为中文时出现问号,如下图:
更新前,Sname是显示的“zhangsan”:
当使用“update Student set Sname='张三' where Sno='2'”语句进行更新后,Sname显示问号:
(3) 在SQL语句的where中使用like模糊匹配查询查不出数据
数据库表中的数据,如下图:
使用like模糊匹配查询查不出数据,如下图:
但在like后面的模糊匹配的内容前加上N就可查询出数据,如下图:
问题产生的原因:
由于数据库属性的排序规则设置不正确。
解决方法:
方法一:手动修改(设置数据库的排序规则)
具体步骤:
选中要修改的数据库-->右键-->属性-->弹出数据库属性对话框-->选项-->把排序规则设置成:Chinese_PRC_90_CI_AS-->确定。
(1)选中要修改的数据库→右键→属性:
(2)弹出数据库属性对话框→选项→把排序规则设置成:Chinese_PRC_90_CI_AS→确定
注意事项:在修改数据库排序规则时首先要确定修改的数据库没有被使用,否则会失败!如下图所示失败提示:
方法二:使用SQL语句修改
在查询分析器中输入下面的SQL语句执行即可:
USE master
GO
ALTER DATABASE 数据库名 COLLATE 排序规则
如要修改test数据库的排序规则,则可:
USE master
GO
ALTER DATABASE test COLLATE Chinese_PRC_90_CI_AS
注意事项:在修改数据库排序规则时首先要确定修改的数据库没有被使用,否则会失败!如下图所示失败提示:
当在修改数据库排序规则时要修改的数据库被使用从而导致排序规则修改失败时的处理方法:
重启数据库服务:选中数据库服务器→右键→重新启动即可:
排序规则术语:
什么是排序规则呢? 排序规则是根据特定语言和区域设置标准指定对字符串数据进行排序和比较的规则。SQL Server 支持在单个数据库中存储具有不同排序规则的对象。在
Microsoft SQL Server中,字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则。
当 Transact-SQL 语句在具有不同排序规则设置的不同数据库上下文中运行时,其运行结果可能会不同。如果可能,请为您的组织使用标准化排序规则。一般情况下,中国区域设置为Chinese_PRC_CI_AS,国外一般设置SQL_Latin1_General_CP1_CI_AS。
排序规则指定了表示每个字符的位模式,还指定了用于排序和比较字符的规则。排序规则的特征是区分语言、区分大小写、区分重音、区分假名以及区分全半角。如下所示:
Chinese_PRC_CI_AS 前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则,CI表示不区分大小写,AS表示区分重音。
排序规则的后半部份即后缀的含义:
_BIN 指定使用向后兼容的二进制排序顺序。
_BIN2 指定使用SQL Server 2005中引入的码位比较语义的二进制排序顺序。
_Stroke 按笔划排序
_CI(CS) 是否区分大小写,CI不区分,CS区分(case-insensitive/case-sensitive)
_AI(AS) 是否区分重音,AI不区分,AS区分(accent-insensitive/accent-sensitive)
_KI(KS) 是否区分假名,KI不区分,KS区分(kanatype-insensitive/kanatype-sensitive)
_WI(WS) 是否区分全半角,WI不区分,WS区分(width-insensitive/width-sensitive)
区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,比较还将重音不同的字母视为不等。
区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项。
无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和
"Chinese_PRC_90_CI_AI" 之间的排序规则冲突。的解决方法
在SQL SERVICE的查询的时候遇到了“无法解决 equal to 运算中 "Chinese_PRC_CI_AS"
和 "Chinese_PRC_90_CI_AI" 之间的排序规则冲突。”的错误,导致这个问题的原因是在表创建的时候,两个字段的排序规则不一样导致的。如图:
解决方法,是在对比条件后面增加 collate Chinese_PRC_90_CI_AI 的转义
如:
where SynchroLog.[FeeSerialNumber]=Synchro.[FeeSerialNumber] collate
Chinese_PRC_90_CI_AI
保持等号两边的排序规则一致即可。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1705701527a1418198.html
评论列表(0条)