标签: freetds

Django < - > SQL Server 2005,文本编码问题

我正在尝试使用以下方法将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库.我对吗?

sql-server django unicode odbc freetds

5
推荐指数
1
解决办法
1743
查看次数

pdo-odbc不起作用whit绑定值,nvarchar和text在等于运算符中不兼容

有一栏 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)

php sql-server odbc pdo freetds

5
推荐指数
1
解决办法
2655
查看次数

安装tiny_tds会在mac os 10.10.5上出错

我正在使用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)

ruby sql-server macos freetds tiny-tds

5
推荐指数
1
解决办法
2285
查看次数

FreeTDS 返回带有空字符的字符串

我正在使用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)

php sql-server freetds

5
推荐指数
0
解决办法
723
查看次数

pyodbc出错:'pyodbc.Cursor'对象没有属性'commit'

我想SQL SERVERpyodbc和连接到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)

python pyodbc freetds

5
推荐指数
1
解决办法
8230
查看次数

Homebrew,FreeTDS,tiny_tds.为什么我在成功安装FreeTDS后无法安装tiny_tds?

这个问题引发了我这个问题.

我希望能解决我的问题,其中有几个答案详细介绍了一些可以帮助安装的配置参数.这些路径不适合我,所以我修改了它们并最终得到了这个:

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上遇到并解决了这个问题?

如果您想了解更多信息,请询问.

ruby macos ruby-on-rails freetds tiny-tds

5
推荐指数
1
解决办法
700
查看次数

使用 ODBC 到 SQL Server 的 Linux 上的字符集不匹配

我在尝试使用适用于 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)

c sql-server odbc character-encoding freetds

5
推荐指数
1
解决办法
6195
查看次数

来自 MS SQL Server 通过 Linux 上的 PHP 的非模拟准备语句支持

概括

我正在尝试使用准备好的语句来停止 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 上安全地执行?

php linux sql-server pdo freetds

5
推荐指数
1
解决办法
769
查看次数

TinyTDS:在配置文件中找不到服务器名称

我一直看到此错误,并且无法连接到远程服务器上的数据库。

给我一个到数据库的连接字符串,如下所示:

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的代码运行!

ruby sql-server ruby-on-rails freetds tiny-tds

5
推荐指数
1
解决办法
3634
查看次数

PDOExeption SQLSTATE[HY001] 无法分配足够的内存

当我从 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 配置是相同的。

php sql-server freetds openvz php-7

5
推荐指数
1
解决办法
1895
查看次数