综述:
对于操作系统中的行为:
对于Delphi中的编程,使用StrCmpLogicalW Windows API进行自然排序.
==========================
将在Windows资源管理器中订购以下文件名,如下所示:
test_1_test.txt
test_2_test.txt
test_11_test.txt
test_12_test.txt
test_21_test.txt
test_22_test.txt
例如,如果我将它们放在TStringList实例中并调用Sort,则排序顺序如下:
test_1_test.txt
test_11_test.txt
test_12_test.txt
test_2_test.txt
test_21_test.txt
test_22_test.txt
为了记录,上述文件名将在Cygwin的rxvt终端或Linux发行版的xterm终端(如CentOS)中进行排序,如下所示:
test_11_test.txt
test_12_test.txt
test_1_test.txt
test_21_test.txt
test_22_test.txt
test_2_test.txt
您能否帮助评论如何理解排序行为的这种差异?此外,是否可以获得与Windows资源管理器中相同的顺序?任何建议表示赞赏!
PS:我的Windows语言环境设置为中文,但我认为英语语言环境也是如此.
可以运行什么T-SQL命令来查找SQL Server中的表或数据库的字符集?
编辑:服务器版本:Microsoft SQL Server 2008 R2(RTM) - 10.50.1600.1(X64)
我检查了数据库表,发现它是latin1_swedish_ci那么我已经改变了它utf8_general_ci,然后我改变了从整理latin1_swedish_ci到utf8_general_ci所有领域.
它仍然给我同样的错误.
操作'='的非法混合排序(utf8_general_ci,IMPLICIT)和(utf8_unicode_ci,IMPLICIT)
谢谢,
我正在尝试将一些mysql表从latin1转换为utf8.我正在使用以下命令,这似乎主要起作用.
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)
但是,在一个表上,我收到有关重复键输入的错误.这是由"名称"字段上的唯一索引引起的.在转换为utf8时,似乎任何"特殊"字符都被索引为它们的直接英语等价物.例如,已存在名称字段值为"Dru"的记录.转换为utf8时,带有"Drü"的记录被视为重复记录.与"Patrick"和"Påtrìçk"相同.
以下是如何重现该问题:
CREATE TABLE `example` ( `name` char(20) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO example (name) VALUES ('Drü'),('Dru'),('Patrick'),('Påtrìçk');
ALTER TABLE example convert to character set utf8 collate utf8_general_ci;
ERROR 1062 (23000): Duplicate entry 'Dru' for key 1
Run Code Online (Sandbox Code Playgroud) 当我试图把现有的数据库(包括数据)的整理,从改变ARABIC_CS_AS到PERSIAN_100_CS_AS出现以下错误:
更改数据库'XXXX'失败.(Microsoft.SqlServer.Smo)
执行Transact-SQL语句或批处理时发生异常.(Microsoft.SqlServer.ConnectionInfo)
对象'ItemTables'依赖于数据库排序规则.如果架构绑定对象依赖于它,则无法更改数据库排序规则.删除数据库排序规则的依赖项,然后重试该操作.
对象'CK_FilteredReportColumnFilters'依赖于数据库排序规则.如果架构绑定对象依赖于它,则无法更改数据库排序规则.删除数据库排序规则的依赖项,然后重试该操作.
对象'CK_FilteredReportColumnFilters_1'依赖于数据库排序规则.如果架构绑定对象依赖于它,则无法更改数据库排序规则.删除数据库排序规则的依赖项,然后重试该操作.
对象'CK_FilteredReportColumnFilters_2'依赖于数据库排序规则.如果架构绑定对象依赖于它,则无法更改数据库排序规则.删除数据库排序规则的依赖项,然后重试该操作.
对象'CK_Reports'依赖于数据库排序规则.如果架构绑定对象依赖于它,则无法更改数据库排序规则.删除数据库排序规则的依赖项,然后重试该操作.ALTER DATABASE失败了.数据库'XXXX'的默认排序规则不能设置为Persian_100_CS_AS.(Microsoft SQL Server,错误:5075)
尝试通过删除这些数据库对象来纠正所提到的错误会导致转换过程中的其他标题出现另一个错误.
任何的想法 ?有没有明确定义的解决方案来解决这个问题?
我最近意识到,Java Collation似乎忽略了空间.
我有以下术语列表:
Amman Jost
Ammann Heinrich
Ammanner Josef
Bär Walter
Bare Werner
Barr Burt
Barraud Maurice
Run Code Online (Sandbox Code Playgroud)
上面的订单反映了德国的所需订单,即占用空间.但是,Java Collation使用
Collator collator = Collator.getInstance(Locale.GERMANY);
Collections.sort(values, collator);
Run Code Online (Sandbox Code Playgroud)
给我以下顺序:
Amman Jost
Ammanner Josef
Ammann Heinrich
Bare Werner
Barraud Maurice
Barr Burt
Bär Walter
Run Code Online (Sandbox Code Playgroud)
上面的结果实际上并不是我所期望的,因为空间没有被考虑(看起来像这里描述的情况:维基百科字母顺序).
这是否意味着,Java Collation不适用于此类用例,或者我在这里做错了什么?有没有办法让Java Collation空间有意识?
我很乐意提出任何意见或建议.
我最近注意到,当我开始一个新的WordPress项目时,我的表的排序自动从utf8_unicode_ci(我在从PhpMyAdmin创建新数据库时选择)变为utf8mb4_unicode_520_ci.
此外,我在PhpMyAdmin的常规设置下注意到,服务器连接排序规则默认为utf8mb4_unicode_520_ci.
我在Ubuntu 17.04上运行MySQL Server 5.7.17和PhpMyAdmin 4.6.6.
我的问题如下:
默认情况下,Sqlite3仅按ascii字母排序.我试图查看谷歌,但我发现的唯一的事情是有关整理的信息.SQLITE3只NOCASE,RTRIM和BIARY归类.如何添加对特定区域设置的支持?(我在Rails应用程序中使用它)
我们都知道使用String的equals()方法进行相等比较会失败.相反,应该使用Collator,如下所示:
// we need to detect User Interface locale somehow
Locale uiLocale = Locale.forLanguageTag("da-DK");
// Setting up collator object
Collator collator = Collator.getInstance(uiLocale);
collator.setStrength(Collator.SECONDARY);
collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
// strings for equality testing
String test1 = "USA lover Grækenland støtte";
String test2 = "USA lover graekenland støtte";
boolean result = collator.equals(test1, test2);
Run Code Online (Sandbox Code Playgroud)
现在,这段代码有效,除非 uiLocale设置为丹麦语,否则结果为真.在这种情况下,它会产生错误.我当然明白为什么会发生这种情况:这只是因为方法equals是这样实现的:
return compare(s1, s2) == Collator.Equal;
Run Code Online (Sandbox Code Playgroud)
此方法调用用于排序的方法并检查字符串是否相同.它们不是,因为丹麦特定的整理规则要求æ后排序(如果我正确理解比较方法的结果)ae.但是,这些字符串实际上是相同的,具有这种强度的情况差异和这样的兼容性字符(这就是它所谓的)应该被视为相等.
要解决这个问题,可以使用RuleBasedCollator和一组适用于相等情况的特定规则.
最后问题是:有没有人知道我在哪里可以得到这样的特定规则(不仅对丹麦语而且对其他语言也是如此),因此兼容性字符,连字等被视为相等(CLDR 图表似乎不包含这样或者我找不到它)?
或者也许我想在这里做一些愚蠢的事情,我应该使用简单的UCA进行相等比较(请问任何代码示例)?
最初,我在本地计算机上创建了SQL Server数据库.我设置了整理Latin1_General_CI_AI,一切运作良好.当我将完成的工作移动到托管SQL Server的Web时,我遇到了问题:它们使用不同的数据库排序规则.那我现在该怎么办?
更确切地说,我需要Latin1_General_CI_AI,但他们有Czech_CI_AS.在比较捷克语的字符串时,这两者有很大不同(令人惊讶的是,我需要latin1 general,而不是Czech,以获得正确的结果.)
当我尝试更改数据库的排序规则时,服务器抱怨我没有用户权限来执行此操作.我试图联系支持台,但没有运气.我可以帮助自己吗?
我知道可能每个单独的表列都有自己的排序规则,所以也许我应该设置所有的字符串列Latin1_CI_AI.但我不知道该怎么做.我只有SQL访问数据库(不幸的是没有SQL Server Management Studio).