1

Тема: Как поменять длину length для всех значений полей таблицы

Приветствую всех! Собственно суть проблемы, делаю запрос для таблицы User:
select Login, length(Login), length('000005904') from User where User_ID = 291
Ответ следующий:
Login          length(Login)    length('000005904')
000005904    12                              12

хотя логин состоит из 9 цифр....

Делаю запрос:

select Login, length(Login), length('000007890') from User where User_ID = 6792
Ответ:
Login          length(Login)      length('000007890')
000007890        12                        9

Делаю:
select Login,length(Login), length('000009253') from User where User_ID = 5191
Ответ:
Login               length(Login)    length('000009253')
000009253                9                              9


Т.е. везде все по разному, и пользователи не могут авторизоваться у кого length = 12 ......  длина должна быть равна 9ти, т.к. все логины это девятизначные номера карт...

Как пакетно привести все в порядок? Какой конструкцией запроса? помогите пожалуйста, ребятки...!

2

Re: Как поменять длину length для всех значений полей таблицы

Попробуйте использовать CHAR_LENGTH(). Функция LENGTH возвращает длину строки в байтах, поэтому для многобайтных кодировок, например utf8, один символ будет состоять из двух байт.

Если не получится, то укажите какой тип данных используется для поля Login.

3 (изменено: kostyara, 2012-05-02 12:30:16)

Re: Как поменять длину length для всех значений полей таблицы

Hanut сказал:

Попробуйте использовать CHAR_LENGTH(). Функция LENGTH возвращает длину строки в байтах, поэтому для многобайтных кодировок, например utf8, один символ будет состоять из двух байт.

При использовании CHAR_LENGTH там где возвращало 12 возвращает 10....

Hanut сказал:

Если не получится, то укажите какой тип данных используется для поля Login.

Поле Login     Тип varchar(255)

MySQL-кодировка: UTF-8 Unicode (utf8)

4

Re: Как поменять длину length для всех значений полей таблицы

А сравнение у поля Login какое?

5

Re: Как поменять длину length для всех значений полей таблицы

Hanut сказал:

А сравнение у поля Login какое?

Сравнение: utf8_general_ci

6

Re: Как поменять длину length для всех значений полей таблицы

kostyara сказал:

Сравнение: utf8_general_ci

Все правильно. Должно работать нормально. Можете показать структуру таблицы и одну строку с данными, которые дают неверный результат?

7

Re: Как поменять длину length для всех значений полей таблицы

Hanut сказал:

Все правильно. Должно работать нормально. Можете показать структуру таблицы и одну строку с данными, которые дают неверный результат?

-- phpMyAdmin SQL Dump
-- version 3.0.1.1
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Май 02 2012 г., 14:03
-- Версия сервера: 5.1.51
-- Версия PHP: 5.2.17

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


--
-- Структура таблицы `User`
--

CREATE TABLE IF NOT EXISTS `User` (
  `User_ID` int(11) NOT NULL AUTO_INCREMENT,
  `Password` varchar(45) NOT NULL DEFAULT '',
  `PermissionGroup_ID` int(11) NOT NULL,
  `Checked` tinyint(4) NOT NULL DEFAULT '0',
  `Language` varchar(255) NOT NULL DEFAULT 'Russian',
  `Created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `LastUpdated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `Email` char(255) DEFAULT NULL,
  `Confirmed` tinyint(4) NOT NULL DEFAULT '0',
  `RegistrationCode` varchar(255) NOT NULL DEFAULT '',
  `Keyword` varchar(255) DEFAULT NULL,
  `Login` varchar(255) NOT NULL DEFAULT '',
  `ForumName` char(255) DEFAULT NULL,
  `ForumAvatar` char(255) DEFAULT NULL,
  `FullName` varchar(255) NOT NULL DEFAULT '',
  `Catalogue_ID` int(11) NOT NULL DEFAULT '0',
  `InsideAdminAccess` tinyint(4) NOT NULL DEFAULT '0',
  `Auth_Hash` text,
  `UserType` enum('normal','pseudo','vk','fb','twitter','openid') NOT NULL DEFAULT 'normal',
  `Account` int(11) DEFAULT '0',
  `ncAttemptAuth` int(11) DEFAULT '0',
  `Sex` int(11) NOT NULL,
  `Phone` char(255) DEFAULT NULL,
  `Address` char(255) DEFAULT NULL,
  `SecondName` char(255) DEFAULT NULL,
  PRIMARY KEY (`User_ID`),
  UNIQUE KEY `User_ID` (`User_ID`),
  KEY `PermissionGroup_ID` (`PermissionGroup_ID`),
  KEY `Checked` (`Checked`),
  KEY `Confirmed` (`Confirmed`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6793 ;

И примеры строки:

Возвращает длину логина 12:

(291, '8b82dfdb445e1dd4db3f8ce45f12ef05', 2, 1, 'Russian', '2012-01-07 19:22:07', '2012-01-07 19:22:07', 'email@mail.ru', 1, '', NULL, '000005904', 'Имя', NULL, '', 0, 0, NULL, 'normal', 3510, 0, 1, '+123456', '', 'Фамилия')

Возвращает длину логина 9, т.е. правильно:

(5191, '3adc67addddsd28ae68af0d9660c88d8', 5, 1, 'Russian', '2012-03-29 12:39:00', '2012-04-23 13:20:13', '', 1, '', NULL, '000009253', 'Имя', '', '', 0, 0, NULL, 'normal', 5665, 0, 1, '+123456', '', 'Фамилия')

Разницы вообще не вижу никакой(((

Где именно происходит это странное изменение длины не пойму, скорее всего на этапе импорта из cvs, может какие то непечатные символы.... Как привести длину в нужный вид ума не приложу.... И спасибо тебе человеческое Hanut за помощь!

8

Re: Как поменять длину length для всех значений полей таблицы

У меня и LENGTH и CHAR_LENGTH возвращают длину строки поля Login в 9 символов для обеих строк. Не могу объяснить такое поведение запроса.

9

Re: Как поменять длину length для всех значений полей таблицы

Hanut сказал:

У меня и LENGTH и CHAR_LENGTH возвращают длину строки поля Login в 9 символов для обеих строк. Не могу объяснить такое поведение запроса.

Вот я думаю может выгрузить загрузить таблицу.... Выгружает логин именно 9 символов... Или оптимизацию + восстановление сделать?

10

Re: Как поменять длину length для всех значений полей таблицы

kostyara сказал:

Вот я думаю может выгрузить загрузить таблицу.... Выгружает логин именно 9 символов... Или оптимизацию + восстановление сделать?

Не могу сказать, я с таким не сталкивался. Посмотрите что даст оптимизация, это проще всего проверить.

11

Re: Как поменять длину length для всех значений полей таблицы

Hanut сказал:

Не могу сказать, я с таким не сталкивался. Посмотрите что даст оптимизация, это проще всего проверить.

Оптимизация не помогла, экспорт импорт тоже...

НО! Я импортировал таблицу в новую базу:
MySQL-кодировка: Windows Cyrillic (cp1251)
Сопоставление: utf8_general_ci

И увидел следующее оказывается некоторые логины имеют приставку



!!!! BOM (Byte Order Mark)!!!

Т.е. при загрузке из cvs эта зараза тоже прогружалась и некоторые логины (визуально все отлично) были корявыми....

12

Re: Как поменять длину length для всех значений полей таблицы

Ясно. Никогда не используйте блокнот. smile