Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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/8/lua/3.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
Sorting Lua Redis中带下划线的排序_Sorting_Lua_Redis_Locale - Fatal编程技术网

Sorting Lua Redis中带下划线的排序

Sorting Lua Redis中带下划线的排序,sorting,lua,redis,locale,Sorting,Lua,Redis,Locale,在我的两台ubuntu服务器上,表的排序方式不同,我遇到了一个问题。我正在redis cli工具中执行以下命令。这是服务器1: 127.0.0.1:6379> eval "local a = {'_mcat:banner','for_meta:1','_size:300x250','_mtype:html', 'axx:1'};table.sort(a);return a;" 0 1) "_mcat:banner" 2) "_mtype:html" 3) "_size:300x250" 4

在我的两台ubuntu服务器上,表的排序方式不同,我遇到了一个问题。我正在redis cli工具中执行以下命令。这是服务器1:

127.0.0.1:6379> eval "local a = {'_mcat:banner','for_meta:1','_size:300x250','_mtype:html', 'axx:1'};table.sort(a);return a;" 0
1) "_mcat:banner"
2) "_mtype:html"
3) "_size:300x250"
4) "axx:1"
5) "for_meta:1"
127.0.0.1:6379> eval "local a;if 'axxx:2'>'_mcat:banner' then a=1 else a=0 end;return a;" 0
(integer) 1

127.0.0.1:6379> eval "local a;if 'a'>'_' then a=1 else a=0 end;return a;" 0
(integer) 1
和服务器2:

127.0.0.1:6379> eval "local a = {'_mcat:banner','for_meta:1','_size:300x250','_mtype:html', 'axx:1'};table.sort(a);return a;" 0
1) "axx:1"
2) "for_meta:1"
3) "_mcat:banner"
4) "_mtype:html"
5) "_size:300x250"
127.0.0.1:6379> eval "local a;if 'axxx:2'>'_mcat:banner' then a=1 else a=0 end;return a;" 0
(integer) 0
127.0.0.1:6379> eval "local a;if 'a'>'_' then a=1 else a=0 end;return a;" 0
(integer) 1
正如您所看到的,问题在于排序如何处理“\u”字符。我曾尝试升级redis&gcc版本,但服务器之间的行为没有改变。测试的Redis版本:2.8.4、2.8.19、4.0.2、gcc版本:4.8.2。运行区域设置在两台服务器上返回相同的值:

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
在Python中执行相同的代码,在两台机器上的效果相同:

>>> sorted(['_mcat:banner','for_meta:1','_size:300x250','_mtype:html', 'axx:1'])
['_mcat:banner', '_mtype:html', '_size:300x250', 'axx:1', 'for_meta:1']
也许有人对下一步该做什么有建议?谢谢

已编辑

在两台运行的服务器上:

eval "local a = {'_mcat:banner','for_meta:1','_size:300x250','_mtype:html', 'axxx:2'};table.sort(a, function(a,b) return a<b end);return a;" 0
在服务器2上:

127.0.0.1:6379> eval "local a = {'_mcat:banner','for_meta:1','_size:300x250','_mtype:html', 'axx:1'};table.sort(a);return a;" 0
1) "axx:1"
2) "for_meta:1"
3) "_mcat:banner"
4) "_mtype:html"
5) "_size:300x250"
127.0.0.1:6379> eval "local a;if 'axxx:2'>'_mcat:banner' then a=1 else a=0 end;return a;" 0
(integer) 0
127.0.0.1:6379> eval "local a;if 'a'>'_' then a=1 else a=0 end;return a;" 0
(integer) 1

鉴于
table.sort
是使用快速排序(
src/ltablib.c
)在Lua本身中实现的,而字符串的比较归结为
strcoll
调用,因此很难说下划线哪里会出错。我会尝试添加一个自定义排序函数,看看这是否会改变结果(
table.sort(a,函数(a,b))返回一个感谢所有的评论和建议,我仍然不知道到底发生了什么,但重建服务器起了作用。

奇怪-看看Redis中的嵌入式Lua引擎,我不知道这是怎么回事。请确实尝试
打印('a'>''''''''''>''''''>'''''''>''''''''''axx'>'>'''>'''''''U mca')
等等,看看哪里出了问题。@Paul Kulchenko'ax'>“\m”返回0,并且从0开始。您对如何处理这些信息有什么建议吗?我想到的唯一一件事是,您使用的不是实际的下划线,而是它的某个unicode变体,它具有多字节内容,因此第一个字节值小于“a”,但第二个字节的值大于小写字符,这将产生您看到的结果。如果不是这样,则@ItamarHaber可能会提出一些建议…在两台服务器上运行
eval“return string.byte(“”),1,string.len(“”)
谢谢你的建议,我尝试了更多的方法,看看编辑过的问题似乎语言环境甚至可以更改下划线的排序顺序,所以可能是这样。请参阅示例。