2013-10-25 4 views
1

У меня есть запрос:MySQL char_length возвращает неверные результаты

select number,char_length(number) from all_numbers where char_length(number)!=10 and number='7034420082'; 

Результаты:

+-------------+---------------------+ 
| number  | char_length(number) | 
+-------------+---------------------+ 
| 7034420082 |     11 | 
+-------------+---------------------+ 

, как это возможно? количество символов составляет 10 символов. я подтвердил, что на каждой стороне номера нет пробела.

mysql> explain all_numbers; 
+--------------------+-------------+------+-----+------------+-------+ 
| Field    | Type  | Null | Key | Default | Extra | 
+--------------------+-------------+------+-----+------------+-------+ 
| number    | varchar(16) | NO | PRI |   |  |..... 
+0

не может подтвердить. 'SELECT CHAR_LENGTH (CAST (7034420082 AS CHAR (16)))' дает мне '10', как и предполагалось. Вы также сказали: «Где номер не« 7034420082 », поэтому я предполагаю, что у вас есть ** что-то **, добавленное к концу/началу. Белый интервал/новые строки/etc? – h2ooooooo

+0

Что делает 'SELECT HEX (number) FROM all_numbers WHERE char_length (number)! = 10 AND number = '7034420082' 'output? – h2ooooooo

+0

h2oooooo, в веб-приложении, которое использует этот db, я сделал следующее: это показало: 7034420082: что говорит мне, что нет свободного пробела ... результат hex равен 3730333434323030383220 – bart2puck

ответ

2

Проблема заключалась в том, что в строке OP добавлено пустое пространство.

SELECT 'foo bar' = 'foo bar ' в MySQL игнорирует конечные пробелы, поэтому он все еще пришел к результату OP.

Вы можете проверить белый интервал, используя SELECT HEX(column), который в корпусе OP дал «3730333434323030383220». Каждый символ переводится в два байта (шестнадцатеричное представление для значения ASCII символа, которое должно быть 0-255), и если мы посмотрим на конец, мы увидим там , который равен «32» в десятичной, ака. a space character.

Solutions (в порядке ", что делает большинство смысла"):

  • Изменение типа данных в BIGINT (который также занимает 8 байт по сравнению с 16). UNSIGNED будет работать лучше здесь, и поддержка телефонных номеров до 18446744073709551615
  • Удалить белое пространство: UPDATE table SET number = TRIM(number)
  • Использование RTRIM а также: SELECT CHAR_LENGTH(RTRIM(number))
  • Использование strlen(trim()) в PHP
Смежные вопросы