MySQL неправильный порядок varchar - PullRequest
0 голосов
/ 29 августа 2018

Я создал страницу с 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, он работает.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

В базе данных действительно есть знак, который не виден сразу. Вероятно, во время первых тестов с Javascript / Ajax.

Совет Билла Карвина помог. Я добавил в свой класс MySQL функцию « Обрезать юникод в PHP 5.2 ». И которые просто пробегают таблицы в цикле и переписывают содержимое с помощью этой функции и, таким образом, очищают базу данных.

Спасибо за вашу помощь.

0 голосов
/ 29 августа 2018

Протестировал ваши данные и ваш запрос и получил такой результат:

. . .

|        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 () не выполняет эту работу.

См. Обрезать пробелы в Юникоде в PHP 5.2 для решения.


Ваш комментарий:

Использование вами функции trim() в PHP не будет работать. Функция PHP trim() распознает только пробельные символы ASCII, а не юникодоподобные символы. См. http://php.net/trim для списка символов, которые ищет обрезка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...