【问题标题】:Select Cyrillic Address on "Latin1_General_CI_AS" Database在“Latin1_General_CI_AS”数据库中选择西里尔地址
【发布时间】:2019-02-04 03:25:58
【问题描述】:

我在slq-server数据库中正确存储了西里尔字母的地址(使用nvarchar)。

选择西里尔地址所在行时,select语句正确返回该行。

但是当尝试选择具有特定地址的所有行时(例如在 where 子句中),选择什么也没找到,因为它采用西里尔搜索词,根据拉丁排序规则将其转换为 ?????' 并搜索对于数据库中的?????',它当然找不到。

可以修复吗?通过服务器或数据库设置,不需要前缀"N",也不会丢失所有的德语、法语、...口音?

和/或是否有西欧和西里尔符号的“整体排序规则”,或一般 UNICODE 的 16 位排序规则?

【问题讨论】:

  • 您在哪里执行您的 T-SQL 语句 - 在 SQL Server Management Studio 中,使用一些脚本,...?谢谢。
  • 这通常是一个 client 设置。例如,当我从 PHP 连接时,我必须将 CharacterSet 连接选项设置为 UTF-8
  • 语句是如何以及在哪里创建的,以及它是如何以及在哪里执行的?你是从某种应用程序中调用它吗?像WHERE SomeColumn='SomeCyrillic' 这样的东西不能工作。这将被解释为 扩展 ASCII 字符串,而WHERE SomeColumn=N'SomeCyrillic' 将使用该字符串作为UCS-2(几乎与utf-16 相同),从而保留所有特殊字符。
  • 顺便说一句:在大多数情况下,建议使用类型化参数而不是文字...(阅读小鲍比表
  • 您能否编辑您的问题,以包含您现有数据库的排序规则以及每个链接中的列?它可能会帮助我们回答您的问题:View Collation Information

标签: sql sql-server database tsql collation


【解决方案1】:

如果您想在cyrillic 中传递您的搜索字符串,但不使用Unicode,您应该在“西里尔数据库”的上下文中启动您的查询,即如果您的数据库(我将其命名为LatinDB)有Latin1_General_CI_AS 排序规则你应该创建另一个数据库,比如CyrDB,它有一个西里尔排序规则,然后从CyrDB 的上下文中查询你的数据库,如下所示:

use CyrDB;

select *
from LatinDB.dbo.your_tbl
where address = 'какой-то там адрес' -- here I'm not using Unicode, no N character behind my string

可以修复吗?通过服务器或数据库设置,无需 需要前缀“N”并且不丢失所有德语, 法语,...口音?

如果您的意思是在结果集中保留这些“口音”,它们将被保留,因为字段为 nvarchar

如果您的意思是要在相同的Cyrillic 上下文中输入查询,您应该精确说明您认为要松散的符号,如果它们的 ascii 代码是从 1 到 127,您仍然可以使用 CyrDB 来启动您的查询,但如果您的字符超过 128 并且您不想将它们作为Unicode 传递,您应该使用具有适当排序规则的另一个数据库的上下文

【讨论】:

  • 这可能适用于非常小的环境,但我怀疑这适用于更大的数据库。然后你可能需要添加很多数据库,如果有更多的语言在使用。所有这些都必须以某种方式同步。似乎是一种相当低效的方法......
  • >>>这可能适用于非常小的环境Unicode 用于传递 Unicode 字符串。问题是 Unicode 是否可以作为 ascii 传递,唯一可能的解决方案是在具有适当排序规则的数据库中进行
  • 不,正确的方法是输入参数。字面量值很危险且难以处理...
猜你喜欢
  • 2011-03-26
  • 1970-01-01
  • 2018-06-02
  • 2013-08-06
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
相关资源
最近更新 更多