MariaDB简单选择顺序不排序

MariaDB简单选择顺序不排序,mariadb,Mariadb,MariaDB的SQL: SELECT name FROM template_items ORDER BY name ASC; MariaDB返回以下内容: 3.1第1页,共2页 h1 2.9第1页,共2页 没有按名称正确排序,为什么 3.1阀体id 1/20332E3120426F64792069642031206F662032 h1/206831 2.9-body-id-1-of-2/322E392D626F64792D69642D312D6F662D32 虽然用户错误通常是可以发现问题

MariaDB的SQL:

SELECT name FROM template_items ORDER BY name ASC;
MariaDB返回以下内容:

3.1第1页,共2页

h1

2.9第1页,共2页

没有按名称正确排序,为什么


3.1阀体id 1/20332E3120426F64792069642031206F662032

h1/206831

2.9-body-id-1-of-2/322E392D626F64792D69642D312D6F662D32

虽然用户错误通常是可以发现问题的地方,但它实际上是一个设计缺陷。列类型是
VARCHAR
,显然MariaDB懒得对数字进行排序,只能按字母排序

因此,我删除了ORDER BY子句,并通过PHP处理排序,从而圆满完成了任务:

$items = array();
while ($row1 = mysqli_fetch_assoc($result1))
{
 array_push($items,$row1['name']);
}
sort($items);
echo '<pre>'.print_r($items,1).'</pre>';
$items=array();
而($row1=mysqli\u fetch\u assoc($result1))
{
数组_push($items,$row1['name']);
}
分类(项目);
回显“”。打印($items,1)。“”;
我遇到了其他一些原因:

  • 某个人在服务器传输后连接到错误的数据库
  • 有关
    ENUM
    类型的信息。(检查您的列类型!)
如果有人知道如何强制MariaDB正确地按字母数字顺序排列行,请随意发布一个工作答案。

虽然用户错误通常是可以发现问题的地方,但它实际上是一个设计缺陷。列类型是
VARCHAR
,显然MariaDB懒得对数字进行排序,只能按字母排序

因此,我删除了ORDER BY子句,并通过PHP处理排序,从而圆满完成了任务:

$items = array();
while ($row1 = mysqli_fetch_assoc($result1))
{
 array_push($items,$row1['name']);
}
sort($items);
echo '<pre>'.print_r($items,1).'</pre>';
$items=array();
而($row1=mysqli\u fetch\u assoc($result1))
{
数组_push($items,$row1['name']);
}
分类(项目);
回显“”。打印($items,1)。“”;
我遇到了其他一些原因:

  • 某个人在服务器传输后连接到错误的数据库
  • 有关
    ENUM
    类型的信息。(检查您的列类型!)
如果有人知道如何强制MariaDB按字母数字顺序正确排列行,请随意发布一个工作答案。

注意前两行的前导空格(十六进制20)。空格在可见字符之前排序;数字在字母之前排序

SELECT name FROM template_items ORDER BY name_numeric, name_alpha ASC;
请参阅
TRIM
函数(在PHP或MySQL/MariaDB中)。但是,当您插入字符串时,您可能应该调用它,而不是按
顺序

注意前两行的前导空格(十六进制20)。空格在可见字符之前排序;数字在字母之前排序

SELECT name FROM template_items ORDER BY name_numeric, name_alpha ASC;

请参阅
TRIM
函数(在PHP或MySQL/MariaDB中)。但是当您插入字符串时,您可能应该调用它,而不是像您在上面的回答中所说的那样,以
orderby

的方式,问题是
VARCHAR
排序是按字典顺序进行的。它从字面上看每个字符,而不是自然排序

在SQL中解决这个问题的一种方法是将
name
字段的数字部分与其余部分分开。理想情况下,您需要与此等效的内容:

SELECT name FROM template_items
 ORDER BY CONVERT(LEFT(name, REGEXP_INSTR(name, '[[:blank:]]')), DECIMAL(4, 2)),
   SUBSTR(name, REGEXP_INSTR(name, '[[:blank:]]'), LENGTH(name)) ASC;
现在,要获得单独的部分
name\u numeric
name\u alpha
,您可以执行以下操作:

其思想是先按字符串左侧名称的数字部分排序,然后查看第一个空格右侧的所有其他内容。请注意,数字部分转换为十进制(4,2)

具体方法在很大程度上取决于数据的格式。您可能需要稍微修改正则表达式,并且可能需要精度更高的
DECIMAL
值。如果需要,您还可以在“分组依据”中加入其他组


但最终,应用层的排序更容易,也更灵活。只有当您的数据模式相对一致时,上述方法才会起作用

正如您在上面的回答中所说,问题在于
VARCHAR
排序是按字典顺序进行的。它从字面上看每个字符,而不是自然排序

在SQL中解决这个问题的一种方法是将
name
字段的数字部分与其余部分分开。理想情况下,您需要与此等效的内容:

SELECT name FROM template_items
 ORDER BY CONVERT(LEFT(name, REGEXP_INSTR(name, '[[:blank:]]')), DECIMAL(4, 2)),
   SUBSTR(name, REGEXP_INSTR(name, '[[:blank:]]'), LENGTH(name)) ASC;
现在,要获得单独的部分
name\u numeric
name\u alpha
,您可以执行以下操作:

其思想是先按字符串左侧名称的数字部分排序,然后查看第一个空格右侧的所有其他内容。请注意,数字部分转换为十进制(4,2)

具体方法在很大程度上取决于数据的格式。您可能需要稍微修改正则表达式,并且可能需要精度更高的
DECIMAL
值。如果需要,您还可以在“分组依据”中加入其他组


但最终,应用层的排序更容易,也更灵活。只有当您的数据模式相对一致时,上述方法才会起作用

显示我们<代码>从模板中选择名称、十六进制(名称)\按名称排序的项目
显示创建表模板\u名称
@RickJames Updated。显示
从模板中选择名称,十六进制(名称)项目按名称排序
SHOW CREATE TABLE template_name
@RickJames Updated.
h1
将被视为
0
,不会在
3.1
2.9
之间排序,按CONCAT(''',name)ASC
@RickJames这在PHP7.2.9上运行得很好,但在7.3.7上不起作用:-\PHP版本不应影响MySQL中的操作???@RickJames No,混淆了本地服务器和实时服务器之间的差异(空格仅在实时服务器上)。
h1
将被视为
0
,不会在
3.1
2.9
之间按CONCAT('',name)排序ASC
@RickJames这在PHP7.2.9上非常有效,但在7.3.7上不起作用-\PHP的版本不应影响MySQL中的操作???@RickJam