mysql按varchar排序错误

doinxwow  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(373)

我用acp创建了一个页面,并将数据保存在那里。一切正常。但突然我有了一个神秘的问题。在公共区域,我总是按字母顺序输出数据,但条目(“受损货物”)总是排在最后。
我要选择的命令:

SELECT lyric_id, lyric_title, lyric_lang_00, lyric_text_00, lyric_lang_01,   
       lyric_text_01, lyric_lang_02, lyric_text_02, lyric_lang_03, lyric_text_03, 
       lyric_lang_04, lyric_text_04, lyric_lang_05, lyric_text_05 
FROM dnd_lyrics 
WHERE lyric_text_00!='' OR lyric_text_01!='' OR lyric_text_01!='' OR   
      lyric_text_02!='' OR lyric_text_03!='' OR lyric_text_04!='' OR 
      lyric_text_05!='' OR lyric_text_03!='' ORDER BY lyric_title ASC"

我要插入的命令:

$db->query("INSERT INTO dnd_lyrics (lyric_title,lyric_lang_00) 
  VALUES('".$db->str($_POST['lyric_title'])."','".$db->str($config['lang'])."')");

受影响的数据库:https://syntaxhigh.normanhuth.com/flnil9
到目前为止,问题只发生在这一个条目上。如果我通过phpmyadmin手动输入它,它就会工作。

vzgqcmou

vzgqcmou1#

测试了您的数据和查询,得到以下结果:

. . .

|        8 | World War 3                        |
|       79 | W​+​J                              |
|       88 | ​Damaged Goods                     |
+----------+------------------------------------+

请注意右栏的对齐方式。数据中有非打印空间。在我的屏幕上,它看起来像:

. . .

|        8 | World War 3                        |
|       79 | W ​+ ​J                              |
|       88 | ​ Damaged Goods                     |
+----------+------------------------------------+

“受损货物”标题在开头有一个额外的非打印空间,这使得它排在所有其他标题之后。
如果我在vim中打开你的数据,我会看到:

(88, '<200b>Damaged Goods', 'en',

unicode 200b是“零宽度空间”:https://www.fileformat.info/info/unicode/char/200b/index.htm
在将数据插入数据库之前,应该对数据执行某种类型的空白修剪操作。不幸的是,reglar php trim()函数不能完成这项工作。
有关解决方案,请参见php5.2中的trim unicode whitespace。
请回复您的意见:
你使用 trim() php中的函数不起作用。php trim() 函数只理解ascii空白字符,而不理解类似unicode空白的字符。看到了吗http://php.net/trim 对于trim要查找的字符列表。

ghhkc1vu

ghhkc1vu2#

数据库中确实有一个不可见的标志。可能是在javascript/ajax的第一次测试中。
比尔·卡尔文的建议起了作用。我在mysql类中添加了“trim unicode whitespace in php5.2”函数。只需在循环中遍历表,并使用此函数重写内容,从而使数据库干净。
谢谢你的帮助。

相关问题