Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

PHP, ORM, MSSQL и Unicode, възможно ли е да ги накараме да работят заедно?

Актуализация: Драйверът вече не е в предварителен преглед. MS предостави официални инструкции за вече пуснатата версия:https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu

Инструкциите по-долу вече не са актуални тъй като MS изтегли изтеглянето на драйвер за предварителен преглед.

Е, има ODBC драйвер, предоставен от Microsoft. Това трябва да осигури правилно поведение в това отношение. Вижте края на публикацията за това как тествах поведението й (предварително). Беше тестван срещу Azure SQL база данни V12.

Как да инсталирате Microsoft SQL ODBC драйвер на Ubuntu 16.04

Това беше тествано на новия екземпляр на Ubuntu 16.04 Azure, който беше базиран на изображението на Ubuntu 16.04 Azure, предоставено от Canonical. След като влязох, преминах към root потребител, използвайки sudo -i , след това:

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

Тествайте го

Заменете сървъра и идентификационните данни в следната команда със свои собствени.

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

В този момент трябва да можете да издавате SQL команди. Добре, нека го накараме да работи с php.

Използвайте го с php

Трябва да се уверим, че пакетът libodbc1 не е инсталиран и че няма да бъде инсталиран, тъй като това би се използвало от php вместо нашия персонализиран съгласуван, и това би довело до проблеми с кодирането.

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

В този момент трябва да го имате наличен като ODBC драйвер.

Тестване на поведението му

Създайте php файл, test.php с UTF-8 кодиране и със следното съдържание. Заменете сървъра, базата данни и идентификационните данни в низа за връзка със свои собствени.

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

Това се изпълнява с php -f test.php показва, че връщаме низа без никаква повреда. Също така низът изглежда добре и от SQL Server Management Studio. Наблюдавах следната заявка на страницата Performance Insight на портала Azure:(@P1 nvarchar(max))INSERT INTO test VALUES(@P1) , така подготвените изявления очевидно бяха използвани, така че предполагам, че може да се справи с вашия (и моя) сценарий.

(Тази публикация беше от голяма полза, докато се опитвах да накарам това да работи:http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ Благодаря Борис !)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 начина да получите името на месеца от дата в SQL Server (T-SQL)

  2. 3 начина да получите списък с бази данни в SQL Server (T-SQL)

  3. Как работи INTERSECT в SQL Server

  4. Разлика между подзаявка и корелирана подзаявка

  5. Как да изпълня GROUP BY на колона с псевдоним в MS-SQL Server?