varchar的MySQL错误订单

时间:2018-08-28 21:05:04

标签: php mysql database mysqli utf-8

我创建了一个带有ACP的页面,并将数据保存在那里。一切运行都没有问题。但是突然之间我遇到了一个神秘的问题。在公共区域,我总是按字母顺序输出数据,但条目(“损坏的物品”)始终排在最后。

我要选择的命令:

nil

我要插入的命令:

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"

受影响的数据库: https://syntaxhigh.normanhuth.com/FlniL9

到目前为止,仅此一项出现了问题。而且,如果我通过phpMyAdmin手动输入它,则可以使用。

2 个答案:

答案 0 :(得分:2)

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

. . .

|        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

在将数据插入数据库之前,应该对数据进行某种空白修剪操作。不幸的是,常规的PHP trim()函数无法完成这项工作。

有关解决方法,请参见Trim unicode whitespace in PHP 5.2


发表评论:

您无法在PHP中使用trim()函数。 PHP trim()函数仅能识别ASCII空格字符,而不能识别类似Unicode空格字符的字符。请参见http://php.net/trim,以获取修饰符查找的字符列表。

答案 1 :(得分:0)

数据库中确实确实存在一个不可见的标志。可能是在使用Javascript / Ajax进行的第一次测试中。

比尔·卡文(Bill Karwin)的小费有所帮助。 我在MySQL类中添加了“ Trim unicode whitespace in PHP 5.2”函数。 并且只需在循环中遍历表并使用此函数重写内容,即可使数据库干净。

感谢您的帮助。