sql >> Databáze >  >> RDS >> Sqlserver

PHP, ORM, MSSQL a Unicode, je možné, aby to fungovalo dohromady?

Aktualizace: Ovladač již není v náhledu. MS poskytl oficiální pokyny pro nyní vydanou verzi:https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu

Níže uvedené pokyny jsou nyní zastaralé protože MS stáhl náhled stažení ovladače.

Existuje ovladač ODBC poskytovaný společností Microsoft. To by mělo zajistit správné chování v tomto ohledu. Podívejte se na konec příspěvku, jak jsem testoval jeho chování (předběžným způsobem). Byl testován proti Azure SQL Database V12.

Jak nainstalovat ovladač Microsoft SQL ODBC na Ubuntu 16.04

To bylo testováno na čerstvé instanci Azure Ubuntu 16.04, která byla založena na bitové kopii Ubuntu 16.04 Azure od společnosti Canonical. Po přihlášení jsem přešel na uživatele root pomocí sudo -i , pak:

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

Vyzkoušet

Nahraďte server a přihlašovací údaje v následujícím příkazu svými vlastními.

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

V tomto okamžiku byste měli být schopni zadávat příkazy SQL. Dobře, pojďme to zprovoznit s php.

Používejte jej s php

Musíme se ujistit, že balíček libodbc1 není nainstalován a že se nenainstaluje, protože by ho používal php místo našeho přizpůsobeného, ​​což by vedlo k problémům s kódováním.

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

V tuto chvíli byste jej měli mít k dispozici jako ovladač ODBC.

Testování jeho chování

Vytvořte soubor php, test.php s kódováním UTF-8 a s následujícím obsahem. Nahraďte server, databázi a přihlašovací údaje v připojovacím řetězci svými vlastními.

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

Spusťte to pomocí php -f test.php ukazuje, že dostaneme zpět řetězec bez jakéhokoli poškození. Řetězec také vypadá dobře z SQL Server Management Studio. Na stránce Performance Insight na Azure Portal jsem zaznamenal následující dotaz:(@P1 nvarchar(max))INSERT INTO test VALUES(@P1) , takže evidentně byly použity připravené výpisy, takže předpokládám, že by to váš (i můj) scénář zvládlo.

(Tento příspěvek byl velkou pomocí při pokusu o zprovoznění:http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ Díky boris !)




  1. Převeďte VARCHAR2 na číslo

  2. Vyberte řádek s nejnovějším datem na uživatele

  3. Jak vytvořit kontingenční tabulku v MySQL

  4. Upozornění na sloupec v cizím klíči, který není součástí indexu, během kompilace místnosti Android. Co to znamená?