MariaDB简单选择顺序不排序
MariaDB的SQL: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 虽然用户错误通常是可以发现问题
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
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
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