我目前正在开发一个网站,它将显示世界上几乎所有语言的内容.我在选择要在mysql中定义的最佳排序规则时遇到问题.
哪一个是最好的支持所有字符??? 还是最准确的???
或者最好将所有字符转换为unicode?
谢谢
这真是一个双重问题,我的两个目标是:
Perl的sort文档说没有块,sort使用"标准字符串比较顺序".但那顺序是什么?应该有一个更好的名称.对于这个问题,我特别指的是语言环境不起作用的情况,因为它定义了自己的顺序.
在过去的几年中,我们通常将标准排序顺序称为"ASCIIbetically".这是在学习Perl和许多其他书籍.但是,该术语已过时.自5.6以来,Perl一直是Unicode感知的.谈论ASCII是老派.由于Perl也支持Unicode,因此它知道字符串.在sv.c,Perl_sv_cmp知道locale,bytes和UTF-8.前两个很容易.但我对第三个没有信心.
/*
=for apidoc sv_cmp
Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
string in C<sv1> is less than, equal to, or greater than the string in
C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
coerce its args to strings if necessary. See also C<sv_cmp_locale>.
=cut
*/
Run Code Online (Sandbox Code Playgroud)
当Perl使用UTF-8进行排序时,它真正排序的是什么?字符串编码的字节,它代表的字符(包括标记可能?),还是其他什么?我认为这是sv.c中的相关行(提交7844ec1的第6698行): …
我的sqlite3数据库包含一个"collate"列约束.我把它放在桌子的架构中,以防止意外地忽略使用必要的整理.但是,这意味着sqlite3从命令行运行而不是从我的Python代码运行时,架构中引用的排序规则不存在,并且我无法使用点命令.
sqlite> .import data.txt table_name
Error: no such collation sequence: my_collation
Run Code Online (Sandbox Code Playgroud)
此外,从Python创建连接并添加所需的排序规则会遇到此问题:
connWithCollation.execute(".import data.txt table_name")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.OperationalError: near ".": syntax error
Run Code Online (Sandbox Code Playgroud)
execute它出现的功能不想通过sqlite3 dot命令.
如果没有必要的校对功能,如何执行sqlite3 dot命令?或者,我如何从Python执行sqlite3 dot命令?
我无意中在开发过程中对数据库中的所有varchar行使用了默认的latin1_swedish_ci字符编码,并且我已经确定这是我一直遇到的字符编码问题的根源.除此之外,似乎大多数人都建议使用utf8_unicode_ci.
我想将我的数据库中所有行的字符编码从latin1_swedish_ci转换为utf8_unicode_ci,但我知道如何做的唯一方法是在phpMyAdmin中逐行更改,这非常耗时.
有没有更快的方法,例如可以运行的查询将所有varchar/text行的排序规则从latin1_swedish_ci更改为utf8_unicode_ci?
我最近升级了WAMPServer,现在在phpMyAdmin中,我看到了两个排序规则utf8_unicode_ci和utf8_unicode_520_ci.我在土耳其应用程序中使用"utf8_unicode_ci",但我想知道新的*_520排序规则有什么不同?
我试图根据包含非英文字符的unicode字符串值对数组/列表/任何数据进行排序,我希望它们按字母顺序正确排序.
我写了很多代码(D2010,win XP),我认为这对于未来的国际化非常可靠,但事实并非如此.它全部使用unicodestring(string)数据类型,到目前为止我刚刚将英文字符放入unicode字符串中.
我似乎不得不承担起非常严重的unicode错误.我跟我的德国朋友聊了一下,尝试了一些德语ß,(ß是's',应该在S之后和T之前的字母表中)和ö等(注意变音符号),我的排序算法都不再适用了.结果非常混乱.垃圾.
从那以后,我一直在广泛阅读并学习了很多关于unicode整理的不愉快的事情.事情看起来很严峻,比我想象的要严重得多,我已经严重搞砸了.我希望我错过了一些东西,事情实际上并不像现在看起来那么严峻.我一直在修补Windows api调用(RtlCompareUnicodeString)没有成功(保护错误),我无法让它工作.我学到的API调用的问题是,他们在各种较新的Windows平台上进行了更改,并且很快就会使用delphi进行交叉平台,随后使用linux,我的应用程序是客户端服务器所以我需要关注这一点,但是这种情况是什么是不是(糟糕)我会感激任何前进的进步,即赢得api具体.
使用win api函数RtlCompareUnicodeString来明显解决方案吗?如果是这样的话,我应该再次尝试,但是我已经对unicode整理所涉及的所有问题感到吃惊,我不知道我应该采取什么方式来比较这些字符串.
我了解了IBM ICU c ++开源项目,虽然是旧版本的ICU,但它有一个delphi包装器.这似乎是一个非常全面的解决方案,它是独立于平台的.当然,我不能为此创建一个delphi包装器(或更新现有的包装器)以获得unicode整理的良好解决方案?
我很高兴听到两个层面的建议: -
A)Windows特定的非便携式解决方案,我很高兴此刻,忘记了客户端服务器的后果!B)一个更便携的解决方案,不受各种unicode api功能的各种XP/vista/win7变种的影响,因此使我在XE2 mac支持和未来的Linux支持方面处于有利地位,更不用说客户端服务器的复杂性了.
顺便说一句我真的不想做'make-do'解决方案,在比较之前扫描字符串并替换某些棘手的字符等,我已经读过了.我给出了上面的德语示例,这只是一个例子,我想让它适用于所有(或至少大多数,远东,俄语)语言,我不想为特定语言或两个语言做变通办法.我也不需要任何关于排序算法的建议,它们很好,它只是字符串比较位错了.
我希望我失踪/做一些愚蠢的事情,这一切看起来都很头疼.
谢谢.
编辑,鲁迪,这是我试图调用RtlCompareUnicodeString的方式.对不起,我已经度过了一段可怕的时光.
program Project26
{$APPTYPE CONSOLE}
uses
SysUtils;
var
a,b:ansistring;
k,l:string;
x,y:widestring;
r:integer;
procedure RtlInitUnicodeString(
DestinationString:pstring;
SourceString:pwidechar) stdcall; external 'NTDLL';
function RtlCompareUnicodeString(
String1:pstring;
String2:pstring;
CaseInSensitive:boolean
):integer stdcall; external 'NTDLL';
begin
x:='wef';
y:='fsd';
RtlInitUnicodeString(@k, pwidechar(x));
RtlInitUnicodeString(@l, pwidechar(y));
r:=RtlCompareUnicodeString(@k,@l,false);
writeln(r);
readln;
end.
Run Code Online (Sandbox Code Playgroud)
我意识到这很可能是错的,我不习惯直接调用api notctions,这是我最好的猜测.
关于StringCompareEx api函数.这看起来真的很好,但只对Vista +有用,我正在使用XP.StringCompare是在XP上,但那不是Unicode!
回顾一下,基本任务是比较两个字符串,并根据当前Windows语言环境中指定的字符排序顺序进行比较.
任何人都可以肯定地说ansicomparetext是否应该这样做?它对我不起作用,但是其他人已经说过应该这样,而我读过的其他内容也表明应该这样做.
这是我在德语语言环境中使用AnsiCompareText时得到的31个测试字符串(空格分隔 - 没有字符串包含空格): -
编辑2.
我仍然希望听到我是否应该期待AnsiCompareText使用区域设置信息,就像lkessler所说的那样,并且lkessler之前也发布了关于这些主题的内容,并且之前似乎已经完成了这些.
然而,根据Rudy的建议,我也一直在检查CompareStringW - 它与CompareString共享相同的文档,所以它不是我之前说过的非unicode.
即使AnsiCompareText无法工作,虽然我认为应该如此,但win32api函数CompareStringW确实可以工作.现在我已经定义了我的API函数,我可以调用它,我得到一个结果,没有错误......但是无论输入字符串如何,我每次都得到相同的结果!它每次返回1 - …
我正在使用此查询来生成博客存档菜单,如下所示:
SELECT CONCAT( MONTHNAME(published) , ' ' , YEAR(published)) AS monthyear,
COUNT(*) AS total
FROM blog_articles
WHERE status = 'Online' AND Year(published) = 2012
GROUP BY CONCAT( MONTHNAME(published) , ' ' , YEAR(published))
Run Code Online (Sandbox Code Playgroud)
预期结果:
January 2012 103
February 2012 87
March 2012 23
April 2012 99
Run Code Online (Sandbox Code Playgroud)
实际结果:

计数是正确的,但不是精神东方,它应该是:
May 2012 1
Run Code Online (Sandbox Code Playgroud)
我怎样才能摆脱有趣的角色而不是英语呢?
当我在phpMyAdmin中运行此查询时,字符很好.
UPDATE
我刚刚尝试运行conn.Execute("SET lc_time_names ='en_US';")并没有解决问题.为了检查,我使用了conn.Execute("SELECT @@ lc_time_names;")并返回"en_US".
另一个更新
在MySQL论坛上搜索相关问题,我发现另一个人抱怨同样的问题.MySQL大师说:
"这是着名的(臭名昭着的)服务器为数字和字符串的CONCAT返回错误的类型.必须使用(强制转换)表单才能使用,驱动程序无法判断真实类型是什么."
我不确定演员是什么或如何解决这个问题.
查看我的prod日志后,我提到了一些错误:
[2012-08-31 15:56:43] request.CRITICAL: Doctrine\DBAL\DBALException:
An exception occurred while executing 'SELECT t0.username ....... FROM fos_user t0 WHERE t0.username = ?'
with params {"1":"Nrv\u29e7Kasi"}:
SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT)
and (utf8_general_ci,COERCIBLE) for operation '='
Run Code Online (Sandbox Code Playgroud)
Alghout我在学说cfg下有UTF-8默认值:
doctrine:
dbal:
charset: UTF8
Run Code Online (Sandbox Code Playgroud)
好像我的所有MySQL表都在latin1_swedish_ci,所以我的问题是:
我是否可以手动更改utf8_general_ci所有表格的校对而无需任何复杂/预防措施?
使用数字对字符串进行排序的方式与一种语言不同.例如,英文数字在升序排序中位于字母之前.但是,在德语中,数字是在字母之后排序的.
我尝试使用Collator以下方法对字符串进行排序:
private Collator collator = Collator.getInstance(Locale.GERMANY);
collator.compare(str1, str2)
Run Code Online (Sandbox Code Playgroud)
但是上面的比较没有考虑字母后的数字规则.
有没有人知道为什么Java在我使用的时候没有考虑这个规则(字母后面的数字)RuleBasedCollator,如下所示:
private final String sortOrder = "< a, A < b, B < c, C < d, D < e, E < f, F < g, G < h, H < i, I < j, J < k, K < l, L < m, M < n, N < o, O < p, P < q, Q < r, R < s, S < t, T …Run Code Online (Sandbox Code Playgroud) 考虑代码两个片段,简单地订购串C#并F#分别为:
C#:
var strings = new[] { "Tea and Coffee", "Telephone", "TV" };
var orderedStrings = strings.OrderBy(s => s).ToArray();
Run Code Online (Sandbox Code Playgroud)
F#:
let strings = [| "Tea and Coffee"; "Telephone"; "TV" |]
let orderedStrings =
strings
|> Seq.sortBy (fun s -> s)
|> Seq.toArray
Run Code Online (Sandbox Code Playgroud)
这两个代码片段返回不同的结果:
在我的具体情况下,我需要关联这两种语言之间的排序逻辑(一种是生产代码,一种是测试断言的一部分).这提出了几个问题:
编辑
在回答几个探测性评论时,运行下面的片段可以更多地了解这种排序差异的确切性质:
F#:
let strings = [| "UV"; "Uv"; "uV"; "uv"; "Tv"; "TV"; "tv"; "tV" |]
let orderedStrings =
strings
|> Seq.sortBy (fun s -> s)
|> …Run Code Online (Sandbox Code Playgroud)