我正在尝试使用以下方法将Django数据存储在MS SQL Server 2005上:
http://code.google.com/p/django-pyodbc/(pyodbc + FreeTDS)
只要我存储由ASCII字符组成的字符串,一切都可以.当我使用unicode(例如'\ xc5\x82')时,django会抛出ProgrammingError:
ProgrammingError at /admin/cli/punktrejestracji/add/
('42000', '[42000] [FreeTDS][SQL Server]The incoming tabular data stream (TDS) protocol stream is incorrect. The stream ended unexpectedly. (4002) (SQLExecDirectW)')
Run Code Online (Sandbox Code Playgroud)
跟踪的最后一个元素是:
params ('\xc5\x82',)
self <django.db.backends.sql_server.pyodbc.base.CursorWrapper object at 0x92ef8ec>
sql 'SELECT (1) AS [a] FROM [cli_punktrejestracji] WHERE [cli_punktrejestracji].[adres] = ? '
Run Code Online (Sandbox Code Playgroud)
BTW http://code.google.com/p/django-mssql/似乎不能在Linux下运行,django-mssql需要pythoncom库.我对吗?
有一栏 url(nvarchar(200), not null)
<?php
//
$pdo = new PDO('odbc:mssql', 'xxx', 'yyy');
$pdo->setAttribute(PDO::ATTR_PERSISTENT, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
// plain sql query: WORKS FINE!
$sth = $pdo->prepare("SELECT COUNT(*) FROM pagina WHERE url = '/webito'");
$sth->execute();
// using bindValue: ERROR!
$sth = $pdo->prepare("SELECT COUNT(*) FROM pagina WHERE url = :unique_value");
$sth->execute(array('unique_value' => '/webito'));
Run Code Online (Sandbox Code Playgroud)
返回错误:
Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 402 [FreeTDS][SQL Server]The data types nvarchar and text are incompatible in the equal to operator. (SQLExecute[402] at /builddir/build/BUILD/php-5.4.15/ext/pdo_odbc/odbc_stmt.c:254) in /root/php/test.php on …
Run Code Online (Sandbox Code Playgroud) 我正在使用mac os,我想通过使用ruby驱动程序连接到sql server.我想使用tiny_tds,但它为缺少free_tds提供了错误,但它已经安装了.怎么能通过这个?
~ brew install freetds
Warning: freetds-0.91.112 already installed
~ sudo gem install tiny_tds
Building native extensions. This could take a while...
ERROR: Error installing tiny_tds:
ERROR: Failed to build gem native extension.
Run Code Online (Sandbox Code Playgroud)
完整日志如下:
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby -r ./siteconf20151013-22489-7z3h0n.rb extconf.rb
checking for sybfront.h... yes
checking for sybdb.h... yes
checking for tdsdbopen() in -lsybdb... no
Extracting freetds-0.91.112.tar.gz into tmp/x86_64-apple-darwin14/ports/freetds/0.91... OK
Running git apply with /Library/Ruby/Gems/2.0.0/gems/tiny_tds-0.7.0/ports/patches/freetds/0.91/Makefile.in.diff...
Running 'patch' for freetds 0.91... OK
Running git apply with /Library/Ruby/Gems/2.0.0/gems/tiny_tds-0.7.0/ports/patches/freetds/0.91/dblib-30-char-username.diff...
Running 'patch' for freetds 0.91... …
Run Code Online (Sandbox Code Playgroud) 我正在使用freetds + unixODBC + php pdo_odbc
访问MSSQL Server 2012
+ CentOS 7 x86_64
+ freetds version 0.95.19
+ unixODBC version 2.3.4
+ php version 5.6.14
Run Code Online (Sandbox Code Playgroud)
当以 UTF-8 从 SQL Server 检索结果时,我(\u0000 in JSON)
在长字符串中得到 NULL 字符,当 JavaScript 编码为“?”时。我在互联网上唯一找到的是FreeTDS 邮件列表中的这篇文章。
顺便说一句,Linux 上的 SQL Server 的 Microsoft ODBC 驱动程序 11在这种情况下工作正常,但还有一些我无法解决的其他问题。
UPD:配置
/etc/freetds.conf
[global]
text size = 2147483647
[ibmMSSQL]
host = ibm.sevkav.local
port = 49927
tds version = 7.3
client charset = UTF-8
Run Code Online (Sandbox Code Playgroud)
/etc/odbc.ini
[ODBC …
Run Code Online (Sandbox Code Playgroud) 我想SQL SERVER
用pyodbc
和连接到Python的数据库freetds
.
我的联系还可以.
我的代码:
class GetSystems(Resource):
def get(self):
try:
cur = Connection.conn.cursor()
cur.execute(
"SELECT id,systemName,SystemDescription FROM MEFSystem")
rows = cur.fetchall()
objects_list = []
for row in rows:
d = collections.OrderedDict()
d['id'] = row[0]
d['systemName'] = row[1]
d['systemDescription'] = row[2]
objects_list.append(d)
logger.info(objects_list)
cur.commit()
cur.close()
logger.info(objects_list)
except Exception as inst:
cur.rollback()
cur.close()
print type(inst)
print inst.args
print inst
logger.error(type(inst))
logger.error(inst.args)
logger.error(inst)
return objects_list
Run Code Online (Sandbox Code Playgroud)
这会在cur.commit()
:中 生成错误pyodbc.Cursor object has no attribute 'commit'
并返回未知数据:
[
{ …
Run Code Online (Sandbox Code Playgroud) 这个问题引发了我这个问题.
我希望能解决我的问题,其中有几个答案详细介绍了一些可以帮助安装的配置参数.这些路径不适合我,所以我修改了它们并最终得到了这个:
gem install tiny_tds -- --with-freetds-include=/usr/local/Cellar/freetds/0.95.21/include
--with-freetds-lib=/usr/local/Cellar/freetds/0.95.21/lib
--with-iconv-include=/usr/local/Cellar/libiconv/1.14/include
--with-iconv-lib=/usr/local/Cellar/libiconv/1.14/lib
Run Code Online (Sandbox Code Playgroud)
但是,运行它会导致我之前遇到的相同错误.如下:
我之前安装了libiconv和FreeTDS brew
.
有没有人在OS X El Capitan上遇到并解决了这个问题?
如果您想了解更多信息,请询问.
我在尝试使用适用于 Linux 的 Microsoft ODBC 驱动程序将非 ASCII 字符插入 SQL Server 数据库时遇到了一个有趣的问题。问题是它似乎在发送和接收数据时假设不同的字符集。有关信息,服务器排序规则设置为 Latin1_General_CI_AS(我只是尝试插入欧洲重音字符)。
使用 tsql(随 FreeTDS 一起提供)进行测试,一切都很好。在启动时,它输出以下内容:
locale is "en_GB.utf8"
locale charset is "UTF-8"
using default charset "UTF-8"
Run Code Online (Sandbox Code Playgroud)
我可以在表中插入和选择非 ASCII 值。
但是,使用我自己的使用 ODBC API 的实用程序,它不起作用。当我执行选择查询时,数据会根据需要以 UTF-8 字符集返回。但是,如果我插入 UTF-8 字符,它们就会损坏。
SQL > update test set a = 'Béthune';
Running SQL: update test set a = 'Béthune'
Query executed OK: 1 affected rows
SQL > select * from test;
Running SQL: select * from test
+------------+
| a |
+------------+
| Béthune | …
Run Code Online (Sandbox Code Playgroud) 概括
我正在尝试使用准备好的语句来停止 SQL 注入,但我无法找到保证它正常工作所需的支持。
设想
我在 Linux 上托管一个站点,该站点连接到带有 FreeTDS 0.91 版的 Microsoft SQL Server,特别是使用 FreeTDS 的dblib
. 我已将tds
数据库连接的版本设置为 7.4,并且正在使用 PHP 的PDO对象。
根据FreeTDS 文档,4.2 不支持准备好的语句:
TDS 4.2 有限制
- 当然,只有ASCII。
- 不支持 RPC。
- 不支持 BCP。
- varchar 字段限制为 255 个字符。如果您的表定义了更长的字段,它们将被截断。
- 不支持动态查询(也称为准备语句)。
然而,没有任何迹象表明 7.4 不支持准备好的语句,这给了我合理的信心,它们至少不会引发驱动程序错误。
PHP 的 PDO 支持通过PDO::setAttribute()
. 我有兴趣PDO::ATTR_ERRMODE
将所有错误设置为异常,并PDO::ATTR_EMULATE_PREPARES
在兼容时强制数据库执行准备好的语句。
问题
测试连接时,我收到以下错误:
数据库错误:SQLSTATE[IM001]:驱动程序不支持此功能:驱动程序不支持设置属性
无法设置PDO::ATTR_EMULATE_PREPARES
,我无法保证数据库实际上按预期执行准备好的语句。
无论如何要修改我的方法,或者是否有替代方法来保证准备好的语句在来自 Linux 的 MS SQL Server 上安全地执行?
我一直看到此错误,并且无法连接到远程服务器上的数据库。
给我一个到数据库的连接字符串,如下所示:
data source=qsss.gar.de\SQL2012,3000;initial catalog=City;persist security info=True;user id=user_me;password=user_me##2009;
Run Code Online (Sandbox Code Playgroud)
现在,我database.yml
基于该连接字符串创建了一个文件,如下所示:
development:
adapter: 'sqlserver'
host: 'qsss.gar.de\SQL2012,3000'
port: 1433
database: 'City'
username: 'user_me'
password: 'user_me##2009'
Run Code Online (Sandbox Code Playgroud)
当我尝试运行服务器时,它总是以配置文件中找不到的服务器名称打我。
opts[:port] ||= 1433
opts[:dataserver] = "#{opts[:host]}:#{opts[:port]}" if opts[:dataserver].to_s.empty?
connect(opts) // ERROR AT THIS LINE
end
def tds_73?
Run Code Online (Sandbox Code Playgroud)
请尝试帮助我弄清楚这是什么问题?
更新:
我可以使用SQLPro for MSSQL
向导使用完全相同的连接参数连接到服务器:
它可以通过向导运行,但不能通过TinyTDS的代码运行!
当我从 php-fpm 运行波纹管代码时:
$connect = new PDO("dblib:host=mssql.dev.gm.local;dbname=GeoData","username","password");
try{
$s = $connect->query('[RU].GetTownInfo 4368');
var_dump($s->fetch());
}catch (Exception $e){
var_dump($e->getMessage());
}
Run Code Online (Sandbox Code Playgroud)
我得到异常:
PDOExeption SQLSTATE[HY001] 无法分配足够的内存
但是当我从 php 命令行运行相同的代码时,我没有这样的问题。
可能是什么问题?
我使用 nginx proxy_pass 到后端(php-fpm)。
要连接到 MS SQL Server,我使用 Dblib (freetds)。OpenVZ、Nginx 和 Php-fpm 在一台机器上的所有工作都是不同的虚拟机。
命令行和上游的 PHP-fpm 配置是相同的。