Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

PHP, ORM, MSSQL und Unicode, ist es möglich, dass diese zusammenarbeiten?

Aktualisierung: Der Treiber befindet sich nicht mehr in der Vorschau. MS hat eine offizielle Anleitung für die jetzt veröffentlichte Version bereitgestellt:https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu

Die nachstehende Anleitung ist mittlerweile veraltet da MS den Preview-Treiber-Download zurückgezogen hat.

Nun, es gibt den von Microsoft bereitgestellten ODBC-Treiber. Das sollte ein angemessenes Verhalten in dieser Hinsicht bieten. Sehen Sie am Ende des Beitrags, wie ich sein Verhalten (vorläufig) getestet habe. Es wurde gegen eine Azure SQL-Datenbank V12 getestet.

So installieren Sie den Microsoft SQL ODBC-Treiber unter Ubuntu 16.04

Dies wurde auf der neuen Ubuntu 16.04 Azure-Instanz getestet, die auf dem von Canonical bereitgestellten Ubuntu 16.04 Azure-Image basierte. Nach dem Einloggen wechselte ich mit sudo -i zum Root-Benutzer , dann:

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

Testen Sie es

Ersetzen Sie den Server und die Anmeldeinformationen im folgenden Befehl durch Ihre eigenen.

sqlcmd -S somedatabase.database.windows.net -U someuser -P somepassword

An dieser Stelle sollten Sie in der Lage sein, SQL-Befehle abzusetzen. Okay, lassen Sie es uns mit PHP zum Laufen bringen.

Verwenden Sie es mit PHP

Wir müssen sicherstellen, dass das libodbc1-Paket nicht installiert ist und dass es nicht installiert wird, da es von PHP anstelle unseres benutzerdefinierten kompilierten Pakets verwendet würde, und dies zu Codierungsproblemen führen würde.

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

An diesem Punkt sollten Sie es als ODBC-Treiber verfügbar haben.

Testen seines Verhaltens

Erstellen Sie eine PHP-Datei test.php mit UTF-8-Codierung und folgendem Inhalt. Ersetzen Sie den Server, die Datenbank und die Anmeldeinformationen in der Verbindungszeichenfolge durch Ihre eigenen.

<?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

Führen Sie dies mit php -f test.php aus zeigt, dass wir die Zeichenfolge ohne Beschädigung zurückerhalten. Auch in SQL Server Management Studio sieht die Zeichenfolge gut aus. Ich habe die folgende Abfrage auf der Performance Insight-Seite des Azure-Portals beobachtet:(@P1 nvarchar(max))INSERT INTO test VALUES(@P1) , also wurden offensichtlich vorbereitete Anweisungen verwendet, daher gehe ich davon aus, dass es Ihr (und mein) Szenario handhaben könnte.

(Dieser Beitrag war eine große Hilfe bei dem Versuch, dies zum Laufen zu bringen:http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ Danke Boris !)