Что такое mysql error
mysqli::$error
Описание
Возвращает сообщение об ошибке последнего вызова функции MySQLi, который может успешно выполниться или провалиться.
Список параметров
Возвращаемые значения
Строка с описанием ошибки. Пустая строка, если ошибки нет.
Примеры
Результат выполнения данных примеров:
Смотрите также
User Contributed Notes 7 notes
The mysqli_sql_exception class is not available to PHP 5.05
?>
This would output something like:
Unexpected PHP error [mysqli::query() [function.query]: (42S22/1054): Unknown column ‘XXname’ in ‘field list’] severity [E_WARNING] in [G:\database.php] line [249]
Very frustrating as I wanted to also catch the sql error and print out the stack trace.
( MYSQLI_REPORT_OFF ); //Turn off irritating default messages
//Do stuff with the result
?>
Prints out something like:
Error No: 1054
Unknown column ‘XXname’ in ‘field list’
Query:
SELECT XXname FROM customer_table
This will actually print out the error, a stack trace and the offending sql statement. Much more helpful when the sql statement is generated somewhere else in the code.
If you have the following situation
you don’t get an error-message, if the ROLLBACK-Query didn’t failed, too. In order to get the right error-message you have to write:
I had to set mysqli_report(MYSQLI_REPORT_ALL) at the begin of my script to be able to catch mysqli errors within the catch block of my php code.
Initially, I used the below code to throw and subsequent catch mysqli exceptions
This works fine and I ‘m able to trap all mysqli errors
Please note that the string returned may contain data initially provided by the user, possibly making your code vulnerable to XSS.
So even if you escape everything in your SQL query using mysqli_real_escape_string(), make sure that if you plan to display the string returned by mysqli_error() you run that string through htmlspecialchars().
As far as I can tell the two escape functions don’t escape the same characters, which is why you need both (the first for SQL and the second for HTML/JS).
mysql_error
mysql_error — Возвращает текст ошибки последней операции с MySQL
Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:
Описание
Список параметров
Возвращаемые значения
Возвращает текст ошибки выполнения последней функции MySQL, или » (пустую строку), если операция выполнена успешно.
Примеры
Пример #1 Пример использования mysql_error()
Результатом выполнения данного примера будет что-то подобное:
Смотрите также
User Contributed Notes 14 notes
Note. There is a bug in either documentation about error_reporting() or in mysql_error() function cause manual for mysql_error(), says: «Errors coming back from the MySQL database backend no longer issue warnings.» Which is not true.
Be aware that if you are using multiple MySQL connections you MUST support the link identifier to the mysql_error() function. Otherwise your error message will be blank.
Just spent a good 30 minutes trying to figure out why i didn’t see my SQL errors.
Using a manipulation of josh ><>‘s function, I created the following. It’s purpose is to use the DB to store errors. It handles both original query, as well as the error log. Included Larry Ullman’s escape_data() as well since I use it in q().
When creating large applications it’s quite handy to create a custom function for handling queries. Just include this function in every script. And use db_query(in this example) instead of mysql_query.
The script writes a log file in directory ( in this case /log ) as well.
The system is vulnerable when database/query information is prompted to visitors. So be sure to hide this information for visitors anytime.
$system_operator_mail = ‘developer@company.com’ ;
$system_from_mail = ‘info@mywebsite.com’ ;
When dealing with user input, make sure that you use
echo htmlspecialchars ( mysql_error ());
?>
instead of
echo mysql_error ();
?>
Otherwise it might be possible to crack into your system by submitting data that causes the SQL query to fail and that also contains javascript commands.
Would it make sense to change the examples in the documentation for mysql_query () and for mysql_error () accordingly?
My suggested implementation of mysql_error():
This will print out something like.
A fatal MySQL error occured.
Query: SELECT * FROM table
Error: (err_no) Bla bla bla, you did everything wrong
«Errors coming back from the MySQL database backend no longer issue warnings.» Please note, you have an error/bug here. In fact, MySQL 5.1 with PHP 5.2:
Warning: mysql_connect() [function.mysql-connect]: Unknown MySQL server host ‘locallllllhost’ (11001)
That’s a warning, which is not trapped by mysql_error()!
some error can’t handle. Example:
ERROR 1044: Access denied for user: ‘ituser@mail.ramon.intranet’ to database ‘itcom’
My suggested implementation of mysql_error():
This will print out something like.
A fatal MySQL error occured.
Query: SELECT * FROM table
Error: (err_no) Bla bla bla, you did everything wrong
MYSQL: Client does not support authentication protocol requested by server; consider upgrading MySQL client
According to the MySQL site (http://dev.mysql.com/doc/refman/5.0/en/old-client.html) the best fix for this is to use the OLD_PASSWORD() function for your mysql DB user. You can reset it by issuing to MySQL:
Set PASSWORD for ‘user’@’host’ = OLD_PASSWORD(‘password’);
This saved my hide.
Following are error codes that may appear when you call MySQL from any host language:
Устраняем типичные ошибки в MySQL
MySQL — система управления базами данных (СУБД) с открытым исходным кодом от компании Oracle. Она была разработана и оптимизирована специально для работы веб-приложений. MySQL является неотъемлемой частью таких веб-сервисов, как Facebook, Twitter, Wikipedia, YouTube и многих других.
Эта статья расскажет, как определять, с чем связаны частые ошибки на сервере MySQL, и устранять их.
Не удаётся подключиться к локальному серверу
Одной из распространённых ошибок подключения клиента к серверу является «ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)».
Эта ошибка означает, что на хосте не запущен сервер MySQL ( mysqld ) или вы указали неправильное имя файла сокета Unix или порт TCP/IP при попытке подключения.
Убедитесь, что сервер работает. Проверьте процесс с именем mysqld на хосте сервера, используя команды ps или grep, как показано ниже.
Если эти команды не показывают выходных данных, то сервер БД не работает. Поэтому клиент не может подключиться к нему. Чтобы запустить сервер, выполните команду systemctl.
Чтобы проверить состояние службы MySQL, используйте следующую команду:
Если в результате выполнения команды произошла ошибка службы MySQL, вы можете попробовать перезапустить службу и ещё раз проверить её состояние.
Если сервер работает (как показано) и вы по-прежнему видите эту ошибку, вам следует проверить, не заблокирован ли порт TCP/IP брандмауэром или любой другой службой блокировки портов.
Не удаётся подключиться к серверу MySQL
Ещё одна похожая и часто встречающаяся ошибка подключения — «(2003) Can’t connect to MySQL server on ‘server’ (10061)». Это означает, что в сетевом соединении было отказано.
Следует проверить, работает ли в системе сервер MySQL (смотрите выше) и на тот ли порт вы подключаетесь (как найти порт, можно посмотреть выше).
Похожие частые ошибки, с которыми вы можете столкнуться при попытке подключиться к серверу MySQL:
Ошибки запрета доступа в MySQL
В MySQL учётная запись (УЗ) определяется именем пользователя и клиентским хостом, с которого пользователь может подключиться. УЗ может также иметь данные для аутентификации (например, пароль).
Причин для запрета доступа может быть много. Одна из них связана с учётными записями MySQL, которые сервер разрешает использовать клиентским программам при подключении. Это означает, что имя пользователя, указанное в соединении, может не иметь прав доступа к базе данных.
В MySQL есть возможность создавать учётные записи, позволяющие пользователям клиентских программ подключаться к серверу и получать доступ к данным. Поэтому при ошибке доступа проверьте разрешение УЗ на подключение к серверу через клиентскую программу.
Увидеть разрешённые привилегии учётной записи можно, выполнив в консоли команду SHOW GRANTS
Входим в консоль (пример для Unix, для Windows консоль можно найти в стартовом меню):
В консоли вводим команду:
Дать привилегии конкретному пользователю в БД по IP-адресу можно, используя следующие команды:
Ошибки запрещённого доступа могут также возникнуть из-за проблем с подключением к MySQL (см. выше).
Потеря соединения с сервером MySQL
С этой ошибкой можно столкнуться по одной из следующих причин:
В первом случае убедитесь, что у вас стабильное сетевое подключение (особенно, если подключаетесь удалённо).
В случае с размером BLOB нужно установить более высокое значение для max_allowed_packet в файле конфигурации /etc/my.cnf в разделах [mysqld] или [client] как показано ниже.
Если файл конфигурации недоступен, это значение можно установить с помощью следующей команды.
Слишком много подключений
Недостаточно памяти
Если такая ошибка возникла, это может означать, что в MySQL недостаточно памяти для хранения всего результата запроса.
Сначала нужно убедиться, что запрос правильный. Если это так, то нужно выполнить одно из следующих действий:
Также может помочь MySQL Tuner. Это полезный скрипт, который подключается к работающему серверу MySQL и даёт рекомендации по настройке для более высокой производительности.
MySQL продолжает «падать»
Если такая проблема возникает, необходимо выяснить, заключается она в сервере или в клиенте. Обратите внимание, что многие сбои сервера вызваны повреждёнными файлами данных или индексными файлами.
Вы можете проверить состояние сервера, чтобы определить, как долго он работал.
Кроме того, можно остановить сервер, сделать отладку MySQL и снова запустить службу. Для отображения статистики процессов MySQL во время выполнения других процессов откройте окно командной строки и введите следующее:
Заключение
Самое важное при диагностике — понять, что именно вызвало ошибку. Следующие шаги помогут вам в этом:
Что такое mysql error
Другой распространенной причиной получения ошибки MySQL server has gone away является выдача команды «закрытия» на соединении MySQL с последующей попыткой выполнить запрос на закрытом соединении.
Если это получено в скрипте, то достаточно просто повторить запрос от клиента, чтобы соединение автоматически восстановилось.
Обычно в этом случае выдаются следующие коды ошибки (какой из них вы получите, зависит от ОС):
Код ошибки | Описание |
CR_SERVER_GONE_ERROR | Клиент не может послать запрос серверу. |
CR_SERVER_LOST | Клиент не получил ошибки при передаче запроса серверу, но он не получил также полного ответа (или хоть какого-то ответа) на запрос. |
Вы также можете получить разрыв соединения, если вы отправили пакет больше 16Мб, если ваш клиент старше чем 4.0.8, а ваш сервер 4.0.8 или новее.
Если у вас возникнет желание сделать отчет об ошибке по этой проблеме, то не забудьте включить в него следующие сведения:
Информацию о том, упал MySQL или нет (это можно определить по файлу hostname.err (see Раздел A.4.1, «Что делать, если работа MySQL сопровождается постоянными сбоями»).
Значение переменной wait_timeout в сервере (это значение выдает mysqladmin variables ).
A.2.3. Ошибка Can’t connect to [local] MySQL server
Если процесс mysqld выполняется, то можно проверить сервер, пробуя использовать следующие различные соединения (конечно, номер порта и путь сокета для вашей конфигурации могут быть другими):
Ниже приводится несколько причин, которые могут вызывать ошибку Can’t connect to local MySQL server :
mysqld не выполняется.
Сервер запущен на системе, использующей MIT-потоки. При работе на системе, в которой отсутствуют «родные» потоки, mysqld использует пакет MIT-pthreads (see Раздел 2.2.3, «Операционные системы, поддерживаемые MySQL»). Однако не во всех версиях MIT-потоков поддерживаются Unix-сокеты. В системе без поддержки сокетов при соединении с сервером всегда необходимо явно указывать имя хоста. Попробуйте проверить соединение с сервером с помощью следующей команды:
Используется Linux, и один из потоков аварийно завершился ( core dump ). В этом случае, перед тем как заново запустить MySQL, необходимо уничтожить все остальные потоки mysqld (например, с помощью сценария mysql_zap ). Обращайтесь к разделу See Раздел A.4.1, «Что делать, если работа MySQL сопровождается постоянными сбоями».
A.2.4. Ошибка Host ‘. ‘ is blocked
Ошибка, подобная следующей:
По умолчанию mysqld блокирует хост после 10 ошибок соединения. Это значение можно легко отрегулировать, запустив сервер следующим образом:
Заметим, что если для некоторого хоста получено это сообщение об ошибке, то следует сначала проверить, все ли в порядке с TCP/IP-соединениями от этого хоста. Если TCP/IP-соединения не работают, то увеличивать значение переменной max_connect_errors бесполезно!
A.2.5. Ошибка Too many connections
Если есть потребность в большем количестве соединений, чем задано по умолчанию (100), то следует перезапустить mysqld с заданием большего значения для переменной max_connections.
Максимальное число соединений MySQL зависит от того, насколько хорошей является библиотека потоков на данной платформе. Linux или Solaris должны быть в состоянии поддерживать 500-1000 одновременных соединений, в зависимости от количества имеющейся памяти и того, чем занимаются клиенты.
A.2.6. Ошибка Some non-transactional changed tables couldn’t be rolled back
Получение ошибки/предупреждения: Warning: Some non-transactional changed tables couldn’t be rolled back при попытке сделать ROLLBACK означает, что для некоторых использованных в транзакции таблиц не поддерживаются транзакции. Команда ROLLBACK на эти нетранзакционные таблицы не подействует.
Чтобы проверить тип таблицы, следует выполнить:
A.2.7. Ошибка Out of memory
По выданному запросу может быть получена ошибка следующего вида:
mysql: Out of memory at line 42, ‘malloc.c’
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory
A.2.8. Ошибка Packet too large
Когда клиент MySQL или сервер mysqld получают пакет с размерами, превышающими max_allowed_packet байтов, программа выдает ошибку Packet too large и закрывает соединение.
В MySQL 3.23 размер самого большого возможного пакета составляет 16 Mб (из-за ограничений клиент-серверного протокола). В MySQL 4.0.1 и выше размер пакета ограничивается только количеством имеющейся на сервере памяти (вплоть до теоретического максимума в 2 Гб).
Увеличение переменной не опасно, поскольку память выделяется только при необходимости; эта переменная скорее является мерой предосторожности для «отлавливания» неправильных пакетов между клиентом и сервером, а также для того, чтобы предупредить ситуацию нехватки памяти, вследствие случайного использования больших пакетов.
A.2.9. Коммуникационные ошибки / Оборванные соединения
В журнале ошибок могут присутствовать ошибки наподобие этой:
010301 14:38:23 Aborted connection 854 to db: ‘users’ user: ‘josh’
Такие ошибки сигнализируют об одной из следующих ситуаций:
Клиентская программа не выполнила mysql_close() перед выходом.
Клиент бездействовал на протяжении более чем wait_timeout или interactive_timeout (see Раздел 4.5.6.4, « SHOW VARIABLES »).
Клиентская программа внезапно завершилась посреди передачи.
Значение переменной сервера Aborted_connects увеличивается в следующих случаях:
Когда пакет соединения содержит неверную информацию.
Когда пользователь не имеет привилегий для соединения с базой данных.
Когда пользователь использует неверный пароль.
Когда на получение пакета соединения уходит более connect_timeout секунд. See Раздел 4.5.6.4, « SHOW VARIABLES ».
Обратите внимание: все перечисленное выше может свидетельствовать о попытке взлома базы данных!
Ниже перечислены другие причины проблем, которые могут возникнуть с оборванными клиентами или разорванными соединениями.
Некоторая проблема с библиотекой потоков, вызывающая прерывания при чтении.
«Криво» сконфигурированный TCP/IP.
Дефектные Ethernet-карты, концентраторы, коммутаторы или кабели. Такие проблемы можно как следует диагностировать только путем замены оборудования.
max_allowed_packet слишком мала, или запросам требуется памяти больше, чем было выделено для mysqld (see Раздел A.2.8, «Ошибка Packet too large »).
A.2.10. Ошибка The table is full
Существует несколько случаев, когда выдается эта ошибка:
Используются таблицы ISAM или MyISAM в операционной системе, которая поддерживает файлы размером до 2 Гб, и файл данных или индексный файл достигли этого предела.
A.2.11. Ошибка Can’t create/write to file
Получение для некоторых запросов ошибки вида:
исходя из предположения, что каталог c:\\temp существует (see Раздел 4.1.2, «Файлы параметров my.cnf »).
Проверьте также код полученной ошибки с помощью perror. Одной из причин также может быть ошибка переполнения диска;
A.2.12. Ошибка в клиенте Commands out of sync
Если получена ошибка Commands out of sync; you can’t run this command now в клиентском коде, то клиентские функции вызываются в неправильном порядке!
A.2.13. Ошибка Ignoring user
Получение следующей ошибки:
Found wrong password for user: ‘some_user@some_host’; ignoring user
означает, что при запуске mysqld или при перезагрузке таблиц привилегий сервер нашел в таблице user запись с неправильным паролем и в результате запись просто игнорируется системой привилегий.
Причины проблемы и способы ее решения могут быть следующими:
A.2.14. Ошибка Table ‘xxx’ doesn’t exist
Обратите внимание: поскольку в MySQL для хранения баз данных и таблиц используются каталоги и файлы, то имена баз данных и каталогов являются зависимыми от регистра символов! (Под Windows имена баз данных и таблиц не зависят от регистра символов, но для всех ссылок на заданную таблицу в пределах запроса должен использоваться одинаковый регистр!)
A.2.15. Ошибка Can’t initialize character set xxx
Получение ошибки наподобие:
MySQL Connection Failed: Can’t initialize character set xxx
Означает, что имеется одна из следующих ситуаций:
Перекомпилировать клиент с поддержкой этой кодировки (see Раздел 2.3.3, «Типичные опции configure »).
Скопировать файлы определения кодировки туда, где, по мнению клиента, они должны находиться.
A.2.16. Не найден файл ( File not found )
A.3. Вопросы, связанные с инсталляцией
A.3.1. Проблемы при линковании с клиентской библиотекой MySQL
Получение ошибок undefined reference для функций, отсутствующих в используемой системе, наподобие следующего:
обычно означает, что библиотека скомпилирована в системе, которая не на 100% совместима с системой пользователя. В этом случае необходимо загрузить последнюю поставку с исходными текстами MySQL и откомпилировать библиотеку самостоятельно (see Раздел 2.3, «Установка исходного дистрибутива MySQL»).
Чтобы исправить это, необходимо предписать системе проводить поиск динамических библиотек в каталоге с клиентской библиотекой MySQL. Это можно сделать одним из следующих способов:
A.3.2. Запуск MySQL от обычного пользователя
Если сервер работает, остановите его (используйте mysqladmin shutdown ).
Измените каталоги и файлы баз данных так, чтобы user_name имел привилегии для чтения и записи файлов в этих каталогах (возможно, это нужно будет делать из Unix-аккаунта root ):
Чтобы запускать сервер от имени данного пользователя автоматически в ходе загрузки системы, добавьте строку user, указывающую имя пользователя, в группе [mysqld] файла опций /etc/my.cnf или файла опций my.cnf из каталога данных сервера. Например:
A.3.3. Проблемы с правами доступа к файлам
Если существуют проблемы с правами доступа к файлам, например, если mysql при создании таблицы выдает следующее сообщение об ошибке:
ERROR: Can’t find file: ‘path/with/filename.frm’ (Errcode: 13)
A.4. Вопросы, связанные с администрированием
A.4.1. Что делать, если работа MySQL сопровождается постоянными сбоями
Все это означает, что обычно таблицы не должны повреждаться; исключение составляют следующие случаи:
Кто-нибудь/что-нибудь убьет процесс mysqld или выключит машину посреди операции обновления.
Кто-нибудь работает с файлами данных или индексными файлами вне mysqld и при этом не делает блокировку таблиц как следует.
Проявила себя в коде записи данных. Это маловероятно, но в общем случае возможно. В этом случае можно попробовать изменить формат файла на соответствующий другому обработчику баз данных, используя ALTER TABLE на исправленной копии таблицы!
Поскольку найти причину сбоя всегда непросто, сначала можно попробовать выяснить, что из того, что работает у других, вызывает аварии у вас. Попытайтесь выполнить следующие действия:
Попробуйте сделать контрольный тест, который мы могли бы использовать, чтобы воспроизвести проблему (see Раздел E.1.6, «Создание контрольного примера при повреждении таблиц»).
Попробуйте выполнить входящий в поставку тест mysql-test и тесты производительности MySQL (see Раздел 9.1.2, «Пакет тестирования MySQL»). Эти тесты должны довольно хорошо протестировать MySQL. Вы можете также добавить в тесты производительности код для имитации своего приложения! Тесты производительности можно найти в каталоге bench в поставке с исходными кодами или, в случае бинарной поставки, в подкаталоге sql-bench своего каталога инсталляции MySQL.
Конфигурирование MySQL в отладочном режиме приводит к включению безопасного распределителя памяти, который может находить некоторые ошибки. Помимо этого, отладочная версия выдает большое количество информации о том, что происходит.
Выясните, применены ли последние патчи для используемой операционной системы.
Попробуйте выполнить следующие действия:
Запустите mysqld в gdb (или в другом отладчике). See Раздел E.1.3, «Отладка mysqld при помощи gdb».
Запустите тестовые скрипты.
Отобразите стек ( backtrace ) и локальные переменные на трех нижних уровнях. В gdb это можно сделать следующими командами после аварийного завершения mysqld внутри gdb :
Попробуйте имитировать работу своего приложения с помощью Perl-скрипта, который бы вызвал аварийное завершение или неправильное функционирование MySQL.
Отправьте нам обычный отчет об ошибке (see Раздел 1.8.1.3, «Как отправлять отчеты об ошибках или проблемах»). Любые подробности будут нелишними. Поскольку MySQL нормально эксплуатируется в очень многих местах, то, возможно, авария вызвана причиной, которая свойственна только вашему компьютеру (например, ошибка, связанная с вашими особенными системными библиотеками).
A.4.2. Как переустановить забытый пароль пользователя root
Если для MySQL пароль пользователя root никогда не устанавливался, то для соединения с сервером в качестве пользователя root пароль не потребуется. Рекомендуется всегда устанавливать пароль для каждого пользователя (see Раздел 4.2.2, «Как обезопасить MySQL от хакеров»).
Если вы забыли установленный для root пароль, то новый пароль можно задать при помощи следующей процедуры:
Установите новый пароль с помощью команды mysqladmin password :
Теперь можно либо просто остановить mysqld и заново запустить его обычным способом, либо просто загрузить таблицы привилегий посредством:
После этого можно будет соединяться, пользуясь новым паролем.
Соединитесь с сервером mysqld посредством:
Выполните следующие команды из клиента mysql :
После этого можно будет соединяться по новому паролю.
Остановите mysqld и запустите его заново, как обычно.
A.4.3. Как MySQL реагирует на переполнение диска
Когда возникает ситуация переполнения диска, MySQL реагирует следующим образом:
Один раз в минуту сервер проверяет, достаточно ли места для записи текущей строки. Если места достаточно, то сервер продолжает работу так, как будто ничего не произошло.
Каждые 6 минут сервер помещает в журнальный файл запись с предупреждением о ситуации переполнения диска.
Для снижения остроты проблемы можно принять следующие меры:
Чтобы продолжать работу, необходимо просто освободить на диске место, достаточное для вставки всех записей.
Учтите, что таблицу, вызвавшую ситуацию переполнения диска, могут ожидать другие потоки. Если существует несколько «блокированных» потоков, то удаление одного потока, ожидающего по причине переполнения диска, позволит продолжаться другим.
A.4.4. Где MySQL хранит временные файлы
Все временные файлы MySQL создает как скрытые; таким образом гарантируется, что временные файлы будут удалены, если mysqld умрет. Недостаток использования скрытых файлов в том, что не будут видны большие временные файлы, забирающие место в файловой системе, где расположен каталог временных файлов.
При сортировке ( ORDER BY или GROUP BY ) MySQL обычно использует один или два временных файла. Максимальный размер требующегося для этого пространства на диске составляет:
sizeof(указатель базы данных) обычно равен 4, но со временем для очень больших таблиц может увеличиться.
ALTER TABLE создает временную таблицу в одном каталоге с исходной таблицей.
A.4.5. Как защитить или изменить сокет-файл MySQL /tmp/mysql.sock
Это защитит ваш каталог /tmp : теперь удалять в нем файлы смогут только их владельцы или суперпользователь ( root ).
Изменить путь к каталогу, где MySQL открывает сокет-файл, можно, воспользовавшись одним из следующих способов:
Укажите путь в глобальном или локальном файле опций. Например, поместите в /etc/my.cnf :
Проверить, работает ли сокет, можно следующей командой:
A.4.6. Проблемы с часовыми поясами
Если есть проблема с тем, что SELECT NOW() возвращает значения GMT, а не местное время, то необходимо установить переменную окружения TZ равной местному часовому поясу. Это должно быть сделано для окружения, в котором работает сервер, например, в safe_mysqld или mysql.server (see Приложение F, Переменные окружения).
A.5. Проблемы, относящиеся к запросам
A.5.1. Чувствительность к регистру при поиске
Если необходимо, чтобы столбец всегда обрабатывался в с учетом регистра, объявите его с типом BINARY (see Раздел 6.5.3, «Синтаксис оператора CREATE TABLE »).
A.5.2. Проблемы с использованием столбцов типа DATE
Поскольку в MySQL выполняются описанные выше преобразования, следующие команды будут работать:
Однако приведенные ниже команды работать не будут:
Поскольку MySQL пакует даты для сохранения, он не может сохранить любую дату, так как она может не поместится в результирующий буфер. Правила принятия дат следующие:
Все значения дней между 0-31 принимаются для любой даты, это удобно для приложения, где вы запрашиваете год, месяц и день в 3х различных полях.
День или месяц могут быть нулем. Это удобно когда вы хотите хранить дату рождения в столбце DATE и знаете только часть ее.
A.5.3. Проблемы со значением NULL
A.5.4. Проблемы с alias
A.5.5. Удаление строк из взаимосвязанных таблиц
Поскольку MySQL до 4.1.0 не поддерживает вложенных запросов, а также использование более одной таблицы в команде DELETE (до версии 4.0), то для удаления строк из 2 взаимосвязанных таблиц следует использовать следующий подход:
Выполните DELETE строк главной таблицы на основе этого же условия.
A.5.6. Решение проблем с отсутствием строк, удовлетворяющих условиям поиска
Если сложный запрос на множестве таблиц совсем не возвращает строк, то для выяснения причин его неуспешного выполнения необходимо выполнить следующую последовательность действий:
Проверьте запрос с помощью EXPLAIN и посмотрите, не присутствуют ли в нем явно неправильные записи (see Раздел 5.2.1, «Синтаксис оператора EXPLAIN (получение информации о SELECT )»).
Выполните SELECT для столбца, который должен был дать совпадение строки с последней исключенной из запроса таблицей.
A.5.7. Проблемы со сравнением чисел с плавающей точкой
Числа с плавающей точкой иногда служат источником неприятностей, поскольку эти числа архитектурно хранятся в компьютере не как точные числа. То, что обычно мы видим на экране, не является точным значением числа.
Поля типов FLOAT, DOUBLE и DECIMAL следующие.
Результат правильный. Хотя кажется, что первые пять записей должны быть отброшены, не выдержав проверки на сравнение, тем не менее, они могут удовлетворить условиям по той причине, что в зависимости от архитектуры компьютера между числами проявляются отличия примерно на уровне десятого знака.
С помощью ROUND() (или подобной функции) проблема не может быть решена, поскольку результат все равно будет числом с плавающей запятой, например:
Вот как выглядят числа в столбце ‘a’:
ПРЕДУПРЕЖДЕНИЕ: НИКОГДА НЕ ПОЛАГАЙТЕСЬ НА ДАННЫЙ МЕТОД В СВОЕМ ПРИЛОЖЕНИИ, ЭТО ПРИМЕР ТОГО, КАКИЕ МЕТОДЫ НЕ СЛЕДУЕТ ИСПОЛЬЗОВАТЬ.
Приведенный выше пример вроде бы работает. Но это случайность, поскольку именно на той конкретной машине, где выполнялась проверка, процессор выполняет арифметические операции с плавающей точкой таким образом, что числа округляются до одинаковых значений. Однако полагаться на то, что так будут работать все без исключения процессоры, нельзя.
Правильный способ сравнения чисел с плавающей запятой заключается в том, чтобы сначала определиться с допустимым отклонением одного числа от другого, а затем при сравнении учитывать этот допуск. Например, если мы договоримся, что числа должны считаться одинаковыми, если они равны с точностью до одной десятитысячной (0,0001), то сравнение должно проводиться следующим образом:
И наоборот, если мы хотим оставить строки, в которых числа одинаковы, то проверка должна быть следующей: