sql >> Database teknologi >  >> RDS >> Sqlserver

PHP, ORM, MSSQL og Unicode, er det muligt at få disse til at fungere sammen?

Opdatering: Driveren er ikke længere i forhåndsvisning. MS har leveret officielle instruktioner til den nu frigivne version:https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu

Instruktionerne nedenfor er nu forældede da MS har hentet forhåndsvisningsdriveren.

Nå, der er ODBC-driveren leveret af Microsoft. Det burde give ordentlig adfærd i denne henseende. Se slutningen af ​​indlægget for, hvordan jeg testede dets adfærd (på en foreløbig måde). Det blev testet mod en Azure SQL Database V12.

Sådan installeres Microsoft SQL ODBC-driveren på Ubuntu 16.04

Dette blev testet på den friske Ubuntu 16.04 Azure-instans, der var baseret på Ubuntu 16.04 Azure-billedet leveret af Canonical. Efter at have logget ind, skiftede jeg til root-brugeren ved hjælp af sudo -i , så:

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

Test det

Erstat serveren og legitimationsoplysningerne i følgende kommando med dine egne.

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

Du bør være i stand til at udstede SQL-kommandoer på dette tidspunkt. Okay, lad os få det til at fungere med php.

Brug det med php

Vi skal sikre os, at libodbc1-pakken ikke er installeret, og at den ikke bliver installeret, da den ville blive brugt af php i stedet for vores brugerdefinerede overholdte, og det ville føre til kodningsproblemer.

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

På dette tidspunkt bør du have den tilgængelig som en ODBC-driver.

Test dens adfærd

Opret en php-fil, test.php med UTF-8-kodning og med følgende indhold. Erstat serveren, databasen og legitimationsoplysningerne i forbindelsesstrengen med din egen.

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

Kører dette med php -f test.php viser, at vi får snoren tilbage uden nogen form for korruption. Strengen ser også godt ud fra SQL Server Management Studio. Jeg observerede følgende forespørgsel på Performance Insight-siden i Azure Portal:(@P1 nvarchar(max))INSERT INTO test VALUES(@P1) , så forberedte udsagn blev åbenbart brugt, så jeg går ud fra, at det kunne klare dit (og mit) scenario.

(Dette indlæg var til stor hjælp, mens jeg forsøgte at få dette til at fungere:http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ Tak boris !)




  1. Grundlæggende om tabeludtryk, del 8 – CTE'er, optimeringsovervejelser fortsatte

  2. Har mysql det, der svarer til Oracles analytiske funktioner?

  3. Hvordan finder man den største tabel i MySQL-databasen?

  4. Hvilken tidsstempeltype skal jeg vælge i en PostgreSQL-database?