База данных MSSQL 2005 имеет сопоставление «German_Phonebook_BIN» (но это не важно). Соединение с db осуществляется через PDO и FreeTDS (используя PHP под Squeeze Debian). Когда я пытаюсь выбрать значения datetime из таблицы, я получаю такие результаты, как:
1 апреля 2008 г. 12: 00: 00: 000
Но я ожидаю получить
2008-01-01 00:00:00
(Обратите внимание, что время 00:00:00 преобразуется в 12:00:00, не знаю, почему 00: 00 = 12: 00 ???). Мне не удается манипулировать утверждениями SELECT
(для выполнения конверсия с CONVERT
). Я не нашел опции в PDO для установки формата даты. SET DATEFORMAT
и SET LANGUAGE
перед SET DATEFORMAT
запроса также не влияют на это. Может ли кто-нибудь дать подсказку, где это можно сделать (и только делать) в PDO? (Btw PEAR :: MBD2 возвращает столбцы datetime в ожидаемом формате, но MDB2 ужасен, когда он должен работать с UTF-8 и MSSQL)
OK, дополнительная информация (показаны только важные фрагменты):
<?php $this->_dsn = 'dblib:host=' . $this->_db['host'] . ';dbname=' . $this->_db['database'] . ';charset=UTF-8'; $this->_handle = new PDO($this->_dsn, $this->_db['user'], $this->_db['password']); print_r($this->_handle->query("SELECT [date_column] FROM [some_table]"));
проверьте настройку в /etc/freetds/locales.conf
или везде, где указывает FREETDSCONF
– например, см. https://www.centos.org/modules/newbb/viewtopic.php?topic_id=29646 .
Другим вариантом может быть использование convert
в вашем SQL-заявлении …
Я считаю, что лучший способ использовать PHP_PDO_DBLIB с SQL SRV – хранить даты как datetime2 (6) в MS SQL SERVER DB. Похоже, что решение проблем с использованием рамки symfony решает многие проблемы.
У меня тоже была эта проблема, и я обнаружил, что по какой-то причине, когда я разрешаю freetds применять настройки из freetds.conf (вместо того, чтобы просто использовать полное имя хоста в моей строке соединителя), даты были корректными.
Например, если я использовал:
$link = new PDO("dblib:host=myhost.myfulldomain.com;dbname=MYDB", $user, $pass);
… тогда он НЕ работал, как ожидалось, – даты были дурацкими. Но если я использовал:
$link = new PDO("dblib:host=myhost;dbname=MYDB", $user, $pass);
… тогда он работает, потому что он нашел «myhost» в моем файле freetds.conf.
Мой файл freetds.conf:
# $Id: freetds.conf,v 1.12 2007/12/25 06:02:36 jklowden Exp $ # # This file is installed by FreeTDS if no file by the same # name is found in the installation directory. # # For information about the layout of this file and its settings, # see the freetds.conf manpage "man freetds.conf". # Global settings are overridden by those in a database # server specific section [global] # TDS protocol version ; tds version = 4.2 # Whether to write a TDSDUMP file for diagnostic purposes # (setting this to /tmp is insecure on a multi-user system) ; dump file = /tmp/freetds.log ; debug flags = 0xffff # Command and connection timeouts ; timeout = 10 ; connect timeout = 10 # If you get out-of-memory errors, it may mean that your client # is trying to allocate a huge buffer for a TEXT field. # Try setting 'text size' to a more reasonable limit text size = 5242880 # A typical Sybase server [egServer50] host = symachine.domain.com port = 5000 tds version = 5.0 # My MS SQL server [myhost] host = myhost.mydomain.com port = 1433 tds version = 8.0