Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

PHP, ORM, MSSQL et Unicode, est-il possible de les faire fonctionner ensemble ?

Mise à jour : Le pilote n'est plus en aperçu. MS a fourni des instructions officielles pour la version maintenant publiée :https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu

Les instructions ci-dessous sont désormais obsolètes comme MS a extrait le téléchargement du pilote de prévisualisation.

Eh bien, il y a le pilote ODBC fourni par Microsoft. Cela devrait fournir un comportement approprié à cet égard. Voir la fin de l'article pour savoir comment j'ai testé son comportement (de manière préliminaire). Il a été testé sur une base de données SQL Azure V12.

Comment installer le pilote Microsoft SQL ODBC sur Ubuntu 16.04

Cela a été testé sur la nouvelle instance Azure Ubuntu 16.04 basée sur l'image Azure Ubuntu 16.04 fournie par Canonical. Après m'être connecté, je suis passé à l'utilisateur root en utilisant sudo -i , puis :

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

Testez-le

Remplacez le serveur et les informations d'identification dans la commande suivante par les vôtres.

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

Vous devriez pouvoir émettre des commandes SQL à ce stade. OK, faisons en sorte que ça marche avec php.

Utilisez-le avec php

Nous devons nous assurer que le package libodbc1 n'est pas installé et qu'il ne sera pas installé, car il serait utilisé par php au lieu de notre personnalisé conforme, et cela entraînerait des problèmes d'encodage.

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

À ce stade, vous devriez l'avoir disponible en tant que pilote ODBC.

Tester son comportement

Créez un fichier php, test.php avec l'encodage UTF-8, et avec le contenu suivant. Remplacez le serveur, la base de données et les informations d'identification dans la chaîne de connexion par les vôtres.

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

Exécuter ceci avec php -f test.php montre que nous récupérons la chaîne sans aucune corruption. En outre, la chaîne semble également bonne à partir de SQL Server Management Studio. J'ai observé la requête suivante sur la page Performance Insight du portail Azure :(@P1 nvarchar(max))INSERT INTO test VALUES(@P1) , donc des instructions préparées ont été évidemment utilisées, donc je suppose qu'il pourrait gérer votre (et mon) scénario.

(Ce message a été d'une grande aide tout en essayant de faire fonctionner cela :http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ Merci boris !)