Задавайте вопросы, мы ответим
Вы не зашли.
У меня есть номера длиной до 255 символов. Я хочу записать его не в виде трехзначного числа, а в виде одного байта. Возможно ли такое?
Неактивен
Используйте тип UNSIGNED TINYINT
http://dev.mysql.com/doc/refman/5.5/en/ … types.html
Неактивен
Спасибо, за ответ. Т.е. мне прямо так его и записывать как число от 0 до 255? Или как число от -128 до 127? Попробовал в heidiSQL в виде 255 записать, а он мне в 127 переправил. И что он мне вернет? Т.е. скажем я не смогу хранить в нем букву или другой символ, как таковой. И при выборке получу число, которое мне нужно будет уже интерпретировать в нужный мне символ?
Отредактированно platedz (16.02.2013 00:20:16)
Неактивен
Обратите внимание на параметр UNSIGNED, если он указан в определении типа, то число от 0 до 255, если нет, то от -128 до 127.
Превратить число в символ можно функцией CHAR: http://dev.mysql.com/doc/refman/4.1/en/ … ction_char
Неактивен
Большое спасибо за ответ, теперь вроде понятно.
Подскажите, пожалуйста. Вот у меня список слов, около полутора миллиона. Мне нужно сделать вывод по первому символу 0-9а-яa-z. Есть ли смысл сделать отдельную таблицу для этого TINYINT с одним первым символом? Ускорит ли это дело? Тем более ведь иначе придется использовать like
Неактивен
Если поиск именно по _первому_ символу, то тут скорее индекс стоит создать на то поле, в котором слово содержится. Достаточно будет индекса на первый символ этого поля. Ну и искать потом запросами
select * from t where `field` like 'a%';
или
select * from t where `field` like 'b%';
Неактивен
Я к тому, что like же он по производительности более тяжелый считается, насколько я знаю. Как быстрее будет происходить выполнение запроса, если я сделаю отдельную таблицу с TINYINT или буду использовать Like по первому символу? Или, если делать отдельную таблицу, может проще записать символ не в виде байта, числа, а в виде символа, или пары символом, если мне нужно будет сделать поиск по первым двум символам. И в каком виде лучше всего хранить эти пары символов в базе?
Также возник вопрос по типу int. В таблице указано, что его длина 4 байта, но ведь ему можно указать точный параметр. Как рассматривается ситуация когда я указываю конкретную длину символов параметру int, например укажу int(10). Тогда ведь он уже будет больше 4 байт получается?
Отредактированно platedz (16.02.2013 09:13:59)
Неактивен
like не будет более тяжелый в том варианте, который я приводил постом выше, потому что будет использовать индекс.
Про отдельную таблицу не совсем понятно - зачем Вы хотите ее ввести? Что это даст?
Про int(1) - это означает, что он может вместить 10 цифр . Но посмотрите лучшетабличку, там про каждый тип прописано, какие числа он вмещает.
Неактивен
Отдельную таблицу ввести, чтобы делать поиск по одному номеру. Я предполагаю, что это должно ускорить выборку, т.к. запрос будет весить всего один байт. Или я ошибаюсь? Но тогда зачем вообще использовать TINYINT и другие типы. Те же varchar и тд.
Про Int и остальные типы не очень понятно. Т.е. int(число). Что здесь число, пробовал в heidisql ставить разную длину, но независимо ни от чего на выходе получал максимальное число согласно таблице
Неактивен
Создайте индекс и составляйте запросы, как я описал выше и будет счастье.
Насчет hedisql не подскажу, к сожалению.
Давайте с другой стороны зайдём - каков максимальный размер числа, которое Вам нужно в таблицу помещать?
Неактивен
Спасибо за ответ.
По поводу индекса если можно подробнее. Я так понимаю нужно добавить параметр index наподобие primary key.
В like я так понял, он используется для того, чтобы урезать строку если поиск начинается с конкретного символа. в like="a%" (и для Like верно только то условие, при котором искомое выражение начинается с символа, но не с %) mysql ищет первый символ, а не рассматривает всю строку. Но тогда не ясно, что же происходит без индекса. Ведь он тоже рассматривает первый символ, а не рассматривает всю строку, т.к. это бессмысленно.
heidisql я упомянул, т.к. пробовал в нем. Т.е. если что-то не так, то можно сослаться на работу конкретной программы.
Максимальный размер числа, скажем длиной 21. (999999999999999999999)
Отредактированно platedz (16.02.2013 11:03:57)
Неактивен
Смотрите здесь
В Вашем случае что-то вроде CREATE INDEX word_index ON t (word(1));
Запрос, который использует индекс, конечно же ничего не урезает, просто индекс помогает быстро найти нужные строки.
Если индекс не используется, то идёт полный перебор.
Что касается больших чисел - bigint unsigned поддерживает числа от 0 до 18446744073709551615,
надеюсь Вам этого хватит ?
Неактивен
Спасибо за ответ. Я честно говоря не очень понял, что делает Index. B частности тот Здесь http://веб-информ.рф/mysql/MySQL_indexes.html написано, что следующий синтаксис работать не будет
SELECT * FROM tbl_name WHERE key_col LIKE "%Patrick%";
Также написано
mysql> SELECT * FROM tbl_name WHERE key_col LIKE "Patrick%";
mysql> SELECT * FROM tbl_name WHERE key_col LIKE "Pat%_ck%";
В первой команде рассматриваются только строки с "Patrick" <= key_col < "Patricl", а во второй - только строки с "Pat" <= key_col < "Pau".
И второй случай мне и вовсе не понятен?
Т.е. правильно ли я понимаю, что при параметре index, поиск все-таки ведется сначала строки?
Что означают дополнительные параметры в word(1)? Что нужно вести поиск только в первом символе? В word(10) в первых 10 символах?
И все-таки неяcно для чего в int числовой параметр?
Отредактированно platedz (16.02.2013 13:43:32)
Неактивен
Вот так:
SELECT * FROM tbl_name WHERE key_col LIKE "%Patrick%";
индекс работать не будет
А вот так
SELECT * FROM tbl_name WHERE key_col LIKE "Patrick%";
будет.
Т.е. правильно ли я понимаю, что при параметре index, поиск все-таки ведется сначала строки?
Совершенно не понял эту фразу.
Что означают дополнительные параметры в word(1)? Что нужно вести поиск только в первом символе? В word(10) в первых 10 символах?
word(1) означает, что индекс строится только по первому символу.
И все-таки неяcно для чего в int числовой параметр?
Я писал вроде выше, не? А еще я писал, что нужно внимательно посмотреть сюда, вопросы и отпадут сами.
Неактивен
Ну хорошо я ставлю word(1)
Что будет происходить в таком запросе?
SELECT * FROM tbl_name WHERE key_col LIKE "Patrick%";
Будет ли работать индекс?
Про то, что длина Int ограничивается количеством байт, я понял. А вот про аргумент, который передается дополнительно, зачем он нужен и что делаен не понял.
Неактивен
Что происходит в запросе Вы можете посмотреть через explain.
Сравните
explain SELECT * FROM tbl_name WHERE key_col LIKE "Patrick%";
с индексом и без индекса.
Аргумент, который передаётся инту дополнительно я никогда не использую, и Вам не советую, пользуйтесь данными из таблицы, ссылку которую я в предыдущем и не только посте.
Неактивен
За explain большое спасибо, как только разберусь с базой попробую с помощью него посмотреть что да как, да и почитать не мешает про index и про explain.
А вот с int непонятно. Понятно, что нужно пользоваться таблицей, но мне так и не ясно для чего этот параметр, если на деле он не работает?
Неактивен
platedz написал:
Про то, что длина Int ограничивается количеством байт, я понял. А вот про аргумент, который передается дополнительно, зачем он нужен и что делаен не понял.
Неактивен
Спасибо, с Int вопросов больше нет.
Неактивен
Подскажите, пожалуйста, по поводу длины символов char и varchar. Скажем я задал длину символов varchar(3). И записал в нее "ФЫВ" Т.е. впринципе оно туда наверное влезает, тк. занимает всего три байта. А если у меня кодировку не cp1251, а utf-8, получается что каждый символ туда не поместиться?
Неактивен
Если varchar(3) кодировки utf8, то он будет занимать 9 байт. Будьте внимательны к кодировкам, в которых хранятся таблицы.
Неактивен
Спасибо за ответ. Т.е. он так и будет урезать по количеству символов, а не по количеству байт? Т.е. скажем если я напишу фыва, то в любом случае получу фыв? И соответственно, с char тоже также, будет 9 байт вместо трех если я укажу char(3)?
Неактивен
А еще подскажите, пожалуйста, по поводу значения not null если я при этом не заношу никакого значения по умолчанию, то что получается? Я к тому, что если мне не нужно записывать никаких значений, то что мне лучше назначить по умолчанию not null или null? И в чем между ними разница?
Отредактированно platedz (25.02.2013 01:17:12)
Неактивен
Если NOT NULL, то значения по умолчанию не будет, но при вставке MySQL добавит 0 для целых и пустую строку для символьных переменных, при этом сгенерировав Warning (при @@sql_mode='TRADITIONAL'; вместо предупреждения будет генерироваться ошибка).
Неактивен
Спасибо за ответ, т.е. не надо писать default '' или default '0', тк. они будут создаваться в любом случае, или может быть есть какие-то настройки этого, в связи с которыми лучше все-таки писать?
Отредактированно platedz (25.02.2013 12:44:12)
Неактивен