#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)