Aktualizacja: Sterownik nie jest już w podglądzie. MS dostarczył oficjalne instrukcje dla obecnie wydanej wersji:https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu
Poniższe instrukcje są teraz nieaktualne ponieważ MS pobrał podgląd sterownika do pobrania.
Cóż, jest sterownik ODBC dostarczony przez Microsoft. To powinno zapewnić właściwe zachowanie w tym zakresie. Zobacz na końcu posta, jak przetestowałem jego zachowanie (wstępnie). Został przetestowany pod kątem Azure SQL Database V12.
Jak zainstalować sterownik Microsoft SQL ODBC w Ubuntu 16.04
Zostało to przetestowane na nowym wystąpieniu Ubuntu 16.04 Azure, które było oparte na obrazie Ubuntu 16.04 Azure dostarczonym przez firmę Canonical. Po zalogowaniu przełączyłem się na użytkownika root za pomocą sudo -i
, a następnie:
apt-get update
apt-get -y install atool make build-essential libc6 libkrb5-3 libgss3 e2fsprogs openssl equivs
wget https://download.microsoft.com/download/2/E/5/2E58F097-805C-4AB8-9FC6-71288AB4409D/msodbcsql-13.0.0.0.tar.gz
atool -x msodbcsql-13.0.0.0.tar.gz
rm msodbcsql-13.0.0.0.tar.gz
pushd msodbcsql-13.0.0.0/
./build_dm.sh --accept-warning | tee build_dm_result.txt
command=$(cat build_dm_result.txt | grep "Run the command" | cut -d"'" -f2)
rm build_dm_result.txt
sh -c "$command"
popd
echo "/usr/lib64" > /etc/ld.so.conf.d/microsoft-lib64.conf
ldconfig
pushd msodbcsql-13.0.0.0/
./install.sh install --accept-license
Przetestuj
Zastąp serwer i poświadczenia w poniższym poleceniu własnymi.
sqlcmd -S somedatabase.database.windows.net -U someuser -P somepassword
W tym momencie powinieneś być w stanie wydawać polecenia SQL. OK, niech działa z php.
Użyj go z php
Musimy upewnić się, że pakiet libodbc1 nie jest zainstalowany i że nie zostanie zainstalowany, ponieważ byłby on używany przez php zamiast naszego niestandardowego, a to prowadziłoby do problemów z kodowaniem.
cat > libodbc1<<EOL
Section: misc
Priority: optional
Standards-Version: 3.9.2
Package: libodbc1
Version: 9999
Description: fake pkg, so that we satisfy the dependency of php7-odbc, so that we can keep our custom built libodbc
EOL
equivs-build libodbc1
dpkg -i libodbc1_9999_all.deb
rm libodbc1
rm libodbc1_9999_all.deb
apt-get install php7.0-odbc php7.0-cli
W tym momencie powinieneś mieć go dostępny jako sterownik ODBC.
Testowanie jego zachowania
Utwórz plik php test.php z kodowaniem UTF-8 i następującą zawartością. Zastąp serwer, bazę danych i poświadczenia w ciągu połączenia własnymi.
<?php
$pdo = new PDO('odbc:Driver={ODBC Driver 13 for SQL Server};Server=tcp:somedatabase.database.windows.net,1433;Database=somedatabase;[email protected];Pwd=somepassword;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;');
$str = 'Árvíztűrő tükörfúrógép, and... 你好,世界';
$pdo->prepare("DROP TABLE test")->execute();
$pdo->prepare("CREATE TABLE test(a NVARCHAR(MAX))")->execute();
$stmt = $pdo->prepare("INSERT INTO test VALUES(?)");
$stmt->bindParam(1, $str);
$stmt->execute();
$stmt = $pdo->prepare("SELECT * FROM test");
$stmt->execute();
$data = $stmt->fetchall();
var_dump($data[0][0]==$str); //Returns true
$stmt = $pdo->prepare("SELECT * FROM test WHERE a=?");
$stmt->bindParam(1, $str);
$stmt->execute();
$data = $stmt->fetchall();
var_dump($data[0][0]==$str); //Returns true
Uruchamianie tego z php -f test.php
pokazuje, że otrzymujemy łańcuch bez żadnych uszkodzeń. Również ciąg wygląda dobrze z SQL Server Management Studio. Zaobserwowałem następujące zapytanie na stronie Performance Insight w Azure Portal:(@P1 nvarchar(max))INSERT INTO test VALUES(@P1)
, więc oczywiście wykorzystano przygotowane zestawienia, więc zakładam, że poradzi sobie z twoim (i moim) scenariuszem.
(Ten post był bardzo pomocny podczas próby uruchomienia tego działania:http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ Dzięki boris !)