mysql, пробел равен пустой строке

У меня ушло 2 часа на устранение проблемы с моей серверной частью.

Причина в том, что пустая строка равна пробелу:

SELECT ' ' = '';
-> 1

SELECT STRCMP(' ', '');
-> 0 /* means equal */

Довольно интересно,

SELECT '' REGEXP '[ ]';
-> 0
SELECT '' REGEXP ' ';
-> 0
SELECT ' ' REGEXP ' ';
-> 1

Могу ли я предотвратить это? Это настройка?

7 голосов | спросил Sebas 14 Jam1000000amThu, 14 Jan 2016 08:56:05 +030016 2016, 08:56:05

2 ответа


0

Причина, по которой это не удается, объясняется в документации здесь http: //dev.mysql.com/doc/refman/5.0/en/char.html :

  

Значения в столбцах CHAR и VARCHAR сортируются и сравниваются в соответствии   сопоставлению набора символов, назначенному столбцу.

     

Все сопоставления MySQL имеют тип PADSPACE. Это означает, что все символы,   Значения VARCHAR и TEXT в MySQL сравниваются без учета каких-либо   замыкающие пробелы. «Сравнение» в этом контексте не включает   Как оператор сопоставления с образцом, для которого завершающие пробелы   существенным.

Одним из способов обойти это было бы приведение к типу BINARY

SELECT BINARY '' = ' ';
0

Вы также можете использовать LIKE:

SELECT '' LIKE ' ';
0
ответил billynoah 14 Jam1000000amThu, 14 Jan 2016 09:02:11 +030016 2016, 09:02:11
0

Не обычный пользователь MySQL, но у меня тоже была эта проблема с MariaDB 10.2.9. Я решил эту проблему, изменив сопоставление столбцов VARCHAR с utf8mb4_unicode_ci to utf8mb4_unicode_nopad_ci.

SELECT '' = ' ' COLLATE utf8mb4_unicode_ci;
Результат: 1

SELECT '' = ' ' COLLATE utf8mb4_unicode_nopad_ci;
Результат: 0

ответил user966939 29 SatEurope/Moscow2018-12-29T22:18:34+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 22:18:34 +0300 2018, 22:18:34

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132