Функция LENGTH() в MySQL возвращает неправильные строки

#mysql

Вопрос:

Поэтому я пытаюсь сделать это,

«Напишите запрос, чтобы получить подробную информацию о сотрудниках, у которых длина имени больше или равна 8»

и ожидаемый результат таков,

ожидаемый

Так что я сделал вот что

 SELECT * FROM employees WHERE LENGTH(fname) gt;= 8;  

однако всякий раз, когда я пытаюсь выполнить код, возвращаемые строки не являются именами, длина которых больше или равна 8

возвращенный

РЕДАКТИРОВАТЬ: Дополнительная картинка выход

ПРАВКА 2: похоже, что из файла, который я импортировал, в столбцах для имени есть пробелы

Комментарии:

1. Каков тип данных столбца fname?

2. Каков набор символов столбца / таблицы? ДЛИНА() измеряет размер в байтах. CHAR_LENGTH() измеряет размер в символах.

3. Как вы импортировали значения в таблицу? Могут ли они содержать конечные пробелы или непечатаемые символы? Чтобы проверить, может быть, попробовать CHAR_LENGTH(TRIM(fname)) gt;= 8 .

4. @MattRaines CHAR_LENGTH(ОБРЕЗКА(fname)) gt;= 8, сработало, спасибо

5. Имя поля first_name или fname ?

Ответ №1:

Похоже, что ваши значения содержат начальные или конечные пробелы. Используйте функцию ОБРЕЗКИ() в дополнение к функции ДЛИНЫ(), например LENGTH(TRIM(fname)) gt;= 8 .

Кроме того, функция LENGTH() измеряет размер строки в байтах, в то время как вас интересует размер строки в символах. Все это означает, что в зависимости от вашего набора символов вы получите разные ответы на свой запрос.

 CREATE TABLE employees(employee_id INT, fname VARCHAR(20)) CHARSET utf8mb4; INSERT INTO employees VALUES  (100, 'Steven'), (101, 'Neena'), (102, 'Lex'), (103, 'Alexander'); SELECT * FROM employees WHERE LENGTH(TRIM(fname)) gt;= 8; --  ------------- -----------  -- | employee_id | fname | --  ------------- -----------  -- | 103 | Alexander | --  ------------- -----------  -- 1 row in set (0.00 sec)  ALTER TABLE employees CONVERT TO CHARSET utf16; SELECT * FROM employees WHERE LENGTH(TRIM(fname)) gt;= 8; --  ------------- -----------  -- | employee_id | fname | --  ------------- -----------  -- | 100 | Steven | -- | 101 | Neena | -- | 103 | Alexander | --  ------------- -----------  -- 3 rows in set (0.00 sec)  ALTER TABLE employees CONVERT TO CHARSET utf32; SELECT * FROM employees WHERE LENGTH(TRIM(fname)) gt;= 8; --  ------------- -----------  -- | employee_id | fname | --  ------------- -----------  -- | 100 | Steven | -- | 101 | Neena | -- | 102 | Lex | -- | 103 | Alexander | --  ------------- -----------  -- 4 rows in set (0.00 sec)  

Альтернативная функция CHAR_LENGTH() измеряет размер в символах.

 SELECT * FROM employees WHERE CHAR_LENGTH(TRIM(fname)) gt;= 8; --  ------------- -----------  -- | employee_id | fname | --  ------------- -----------  -- | 103 | Alexander | --  ------------- -----------  -- 1 row in set (0.00 sec)