Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以为Windows 7和/或8创建不区分大小写的自定义区域设置?_Windows_Postgresql_Locale_Collation_Case Insensitive - Fatal编程技术网

是否可以为Windows 7和/或8创建不区分大小写的自定义区域设置?

是否可以为Windows 7和/或8创建不区分大小写的自定义区域设置?,windows,postgresql,locale,collation,case-insensitive,Windows,Postgresql,Locale,Collation,Case Insensitive,动机:我想以不区分大小写的方式处理PostgreSQL中的字符串。我知道CITEXT数据类型,也知道可以使用LOWER函数的函数索引 不过,最有效的解决方案似乎是使用不区分大小写的排序规则,这在Sql Server中是微不足道的。无论如何,PostgreSQL似乎无法定义自己的自定义排序规则,相反,它从操作系统中的区域设置(即我的示例中的Windows)派生它们 所以,问题是,有没有可能创建一个自定义的Windows区域设置,以不区分大小写的方式处理字符 我能得到的最远的结果是安装一个插件,并将

动机:我想以不区分大小写的方式处理PostgreSQL中的字符串。我知道
CITEXT
数据类型,也知道可以使用
LOWER
函数的函数索引

不过,最有效的解决方案似乎是使用不区分大小写的排序规则,这在Sql Server中是微不足道的。无论如何,PostgreSQL似乎无法定义自己的自定义排序规则,相反,它从操作系统中的区域设置(即我的示例中的Windows)派生它们

所以,问题是,有没有可能创建一个自定义的Windows区域设置,以不区分大小写的方式处理字符

我能得到的最远的结果是安装一个插件,并将en-US语言环境导出到相应的XML表示(称为LDML)中,以查看其中的内容。查找sort关键字将返回以下两行:

  <msLocale:sortName type="en-US" />
  <msLocale:sortGuid type="{00000001-57EE-1E5C-00B4-D0000BB1E11E}" />
(键下有更多字符串值)

这不会导致任何结果。我不再比以前更接近不区分大小写的自定义区域设置

LDML可以用来描述不区分大小写的区域设置,但我不知道如何构造一个区域设置

编辑 值得思考的是:

SQL Server:

SELECT 'Latin1_General_CS_AS' AS 'Collation',
    COLLATIONPROPERTY('Latin1_General_CS_AS', 'CodePage') AS 'CodePage', 
    COLLATIONPROPERTY('Latin1_General_CS_AS', 'LCID') AS 'LCID',
    CONVERT(VARBINARY(8), COLLATIONPROPERTY('Latin1_General_CS_AS', 'ComparisonStyle')) AS 'ComparisonStyle', 
    COLLATIONPROPERTY('Latin1_General_CS_AS', 'Version') AS 'Version'
UNION ALL
SELECT 'Latin1_General_CI_AS' AS 'Collation', 
    COLLATIONPROPERTY('Latin1_General_CI_AS', 'CodePage') AS 'CodePage', 
    COLLATIONPROPERTY('Latin1_General_CI_AS', 'LCID') AS 'LCID',
    CONVERT(VARBINARY(8), COLLATIONPROPERTY('Latin1_General_CI_AS', 'ComparisonStyle')) AS 'ComparisonStyle', 
    COLLATIONPROPERTY('Latin1_General_CI_AS', 'Version') AS 'Version'
屈服

Collation               CodePage    LCID    ComparisonStyle Version
Latin1_General_CS_AS    1252        1033    0x00030000      0
Latin1_General_CI_AS    1252        1033    0x00030001      0
Win32 API:

SELECT 'Latin1_General_CS_AS' AS 'Collation',
    COLLATIONPROPERTY('Latin1_General_CS_AS', 'CodePage') AS 'CodePage', 
    COLLATIONPROPERTY('Latin1_General_CS_AS', 'LCID') AS 'LCID',
    CONVERT(VARBINARY(8), COLLATIONPROPERTY('Latin1_General_CS_AS', 'ComparisonStyle')) AS 'ComparisonStyle', 
    COLLATIONPROPERTY('Latin1_General_CS_AS', 'Version') AS 'Version'
UNION ALL
SELECT 'Latin1_General_CI_AS' AS 'Collation', 
    COLLATIONPROPERTY('Latin1_General_CI_AS', 'CodePage') AS 'CodePage', 
    COLLATIONPROPERTY('Latin1_General_CI_AS', 'LCID') AS 'LCID',
    CONVERT(VARBINARY(8), COLLATIONPROPERTY('Latin1_General_CI_AS', 'ComparisonStyle')) AS 'ComparisonStyle', 
    COLLATIONPROPERTY('Latin1_General_CI_AS', 'Version') AS 'Version'
:

dwCmpFlags
参数的标志可以在
C:\ProgramFiles(x86)\Microsoft SDK\Windows\v7.1A\Include\WinNls.h
中找到:

//
//  String Flags.
//
#define NORM_IGNORECASE           0x00000001  // ignore case
#define NORM_IGNORENONSPACE       0x00000002  // ignore nonspacing chars
#define NORM_IGNORESYMBOLS        0x00000004  // ignore symbols

#define LINGUISTIC_IGNORECASE     0x00000010  // linguistically appropriate 'ignore case'
#define LINGUISTIC_IGNOREDIACRITIC 0x00000020  // linguistically appropriate 'ignore nonspace'

#define NORM_IGNOREKANATYPE       0x00010000  // ignore kanatype
#define NORM_IGNOREWIDTH          0x00020000  // ignore width
#define NORM_LINGUISTIC_CASING    0x08000000  // use linguistic rules for casing
由此我得出结论:

  • 使用
    Latin1\u General\u CS\u AS
    将导致使用标志
    NORM\u IGNOREKANATYPE | NORM\u IGNOREWIDTH调用
    CompareStringEx
  • 使用
    Latin1\u General\u CI\u AS
    将导致使用标记
    NORM\u IGNOREKANATYPE | NORM\u IGNOREWIDTH | NORM\u IGNORECASE

但下一步是什么?如何创建自己的Windows区域设置,类似于拉丁文1\u General\u CI\u AS
,但在SQL Server之外可用?

可能没有人这样做。我认为这是可能的,但这种情况没有经过测试,没有人知道是否有副作用

这个问题仍然在PostgreSQL待办事项列表中,克雷格·林格(Craig Ringer)发送了一份如何实施它的建议


另外,在Windows中,没有不区分大小写的排序规则。所有规则都可以对忽略大小写的情况进行排序,但这是通过标志而不是排序来处理的。没有办法添加自定义排序方法。

我对Windows不太熟悉,不能肯定,但是……难道不可能编译Postgres以便它可以访问内置的Windows排序规则吗?没有必要编译任何东西。PostgreSQL允许通过排序规则公开区域设置。这既不是问题,也不是问题。首先,问题是如何创建不区分大小写的区域设置。鉴于windows和tsql都公开了这样的内容,我希望在操作系统级别提供一个,因此我的问题是……请详细说明公开这样的内容的windows。我知道没有不区分大小写的windows区域设置。你有名字吗?对于Sql Server的排序规则,确实存在不区分大小写的排序规则,但知道这一点对我没有帮助。我不知道如何利用这些知识来实现我的目标。嗯,我进一步发布的链接似乎列出了windows和sql server中存在的排序规则或字符集名称。令我惊讶的是,windows是一个不区分大小写的平台,它会为sql server创建特殊的不区分大小写的排序规则,而不会将其公开给其他应用程序使用。再说一次,我已经10年没有用10英尺长的杆子碰过窗户了,所以我只是在猜测。但我最好的猜测是:在操作系统级别存在不区分大小写的排序规则,如果正确的话,那么最省力的方法就是让Postgres知道它们——标志、路径等等。谢谢链接。谁知道什么时候实施,我现在就需要。这就是我寻找其他方法的原因。Helas,没有其他方法可用。我不想要自定义排序方法。我对标准的一个非常好,并给它一个忽略案例的标志。但是,我如何才能创建这样一个在Sql Server之外可用的区域设置呢?我可能应该在我的回答中省去单词方法。我不是说这是一种功能,而是一种总体战略。Windows中不支持自定义排序。区域设置无法绑定到具有特定标志集的规则集。这些类型的排序是特定于数据库实现的。这非常令人伤心。@EricMSFT:出于好奇,就是说Windows本身通过在区分大小写的排序规则上设置一个标志来实现不区分大小写的排序,还是我误解了你的回答?@Denis:Windows存储适合不同级别排序的权重(有关实现多级比较的示例,请参阅)。当请求不区分大小写的排序时,我们忽略外壳级别的重量。
//
//  String Flags.
//
#define NORM_IGNORECASE           0x00000001  // ignore case
#define NORM_IGNORENONSPACE       0x00000002  // ignore nonspacing chars
#define NORM_IGNORESYMBOLS        0x00000004  // ignore symbols

#define LINGUISTIC_IGNORECASE     0x00000010  // linguistically appropriate 'ignore case'
#define LINGUISTIC_IGNOREDIACRITIC 0x00000020  // linguistically appropriate 'ignore nonspace'

#define NORM_IGNOREKANATYPE       0x00010000  // ignore kanatype
#define NORM_IGNOREWIDTH          0x00020000  // ignore width
#define NORM_LINGUISTIC_CASING    0x08000000  // use linguistic rules for casing