标签: dbi

使用Perl/DBI在MySQL表中截断utf-8字符串

我试图使用perl/DBI将utf-8字符串写入MySQL表.由于某种原因,字符串在第一个非ascii字符处被截断.

例如,如果我设置下表:

CREATE DATABASE testdb DEFAULT CHARSET=utf8;
CREATE TABLE testdb.testtable (textval CHAR(30)) DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

然后运行以下perl代码:

#!/usr/bin/perl
use strict;
use DBI;
my $dbh = DBI->connect('DBI:mysql:host=localhost;database=testdb', 'testuser', 'somepassword', {mysql_enable_utf8 => 1}) or die $DBI::errstr;
$dbh->do('SET NAMES utf8');
$dbh->do("INSERT INTO testtable (textval) VALUES ('the N\xFCrburgring')");
Run Code Online (Sandbox Code Playgroud)

它实际上写的是"N".(什么时候应该写"纽伯格林")

查看MySQL查询日志,我看到:

271 Query INSERT INTO testtable (textval) VALUES ('the Nürburgring')
Run Code Online (Sandbox Code Playgroud)

所以字符串完整地到达DB服务器.

如果我直接在MySQL控制台中输入相同的查询:

INSERT INTO testtable (textval) VALUES ('the Nürburgring');
Run Code Online (Sandbox Code Playgroud)

整个字符串都正确写入.知道我做错了什么吗?

mysql perl utf-8 dbi

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

Perl - DBI和.pgpass

我可以使用以下命令成功创建与Postgres数据库的连接:

my $settings = {
    host => 'myhost',
    db => 'mydb',
    user => 'myuser',
    passwd => 'mypasswd'
};

my $connection = DBI->connect(
    'DBI:Pg:dbname=' . $settings->{'db'} . ';host=' . $settings->{'host'},
    $settings->{'user'},
    $settings->{'passwd'},
    {
        RaiseError => 1,
        ShowErrorStatement => 0,
        AutoCommit => 0
    }
) or die DBI->errstr;
Run Code Online (Sandbox Code Playgroud)

但是我在Perl模块中留下了有价值的登录凭据(是的,我更改了它们).目前,我用psql交互式方式发出查询.为了节省必须记住我的用户名/密码,我已将凭据放在具有权限600的文件(〜/ .pgpass)中.文件如下所示:

# host:port:database:user:passwd
myhost:5432:mydb:myuser:mypasswd
Run Code Online (Sandbox Code Playgroud)

如何安全地使用此文件("$ENV{HOME}/.pgpass")和DBI模块来隐藏我的凭据?可以吗?什么是最佳做法?

unix postgresql bash perl dbi

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

如何在Update usint Perl DBI期间查看MYSQL是否截断了一个字段

当我在DBVis中运行此更新SQL时,我收到一个错误(数据截断:第1行的列'描述'的数据太长).

但是,在Perl(DBI)中,这并没有给我一个我猜的错误,因为记录实际上是用截断值更新的.

谁能告诉我如何显示此错误?

mysql perl dbi truncated

4
推荐指数
1
解决办法
654
查看次数

如何在Perl中确定Mysql连接ID?

我想了解,我的模块是否与MySQL共享DBI连接或没有.我想确定他们的连接ID.可能有更好的解决方案(我想知道它们),但第一个问题仍然是知道连接ID.

mysql perl dbi

4
推荐指数
1
解决办法
692
查看次数

DBI:bind_param将字符串强制转换为ntext - > nvarchar(max)和ntext不兼容

我有一个关于perl DBI的bind_param的问题.以下SQL工作原理:

my $sth = $dbh->prepare("SELECT id FROM table WHERE id = 'string'");
$sth->execute();
Run Code Online (Sandbox Code Playgroud)

虽然以下不是:

my $sth = $dbh->prepare("SELECT id FROM table WHERE id = ?");
$sth->execute('string');
Run Code Online (Sandbox Code Playgroud)

上次查询导致的错误是[ODBC SQL Server Driver][SQL Server]The data types nvarchar(max) and ntext are incompatible in the equal to operator. (SQL-42000).

似乎是bind_param,被调用execute,将'string'强制转换为ntext.我该如何解决这个问题?

sql perl ntext sqlbindparameter dbi

4
推荐指数
1
解决办法
912
查看次数

使用 Ruby 连接到 MSSQL 数据库

您好,我正在尝试通过 DBI gem 连接到 MS SQL 数据库。

我已经安装了 dbi 和 dbd-odbc gems。我已将 ODBC 驱动程序(系统 DSN)设置为“MYDSN”

执行命令时:

require 'dbi'    
mydb = DBI.connect('dbi:ODBC:MYDSN', 'user', 'password')
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

DBI::InterfaceError: Unable to load driver 'ODBC' (underlying error: uninitialized constant DBI::DBD::ODBC)
Run Code Online (Sandbox Code Playgroud)

有什么问题吗?

谢谢。

ruby sql-server odbc dbi

4
推荐指数
1
解决办法
3894
查看次数

如何在Perl中创建Postgres数据库?

如何从Perl创建Postgres数据库?这在Perl Postgres DBI驱动程序DBD::Pg(或几乎其他任何地方)中没有记录。我需要能够从我的程序中创建一个临时数据库,而不是必须使用psqlpgAdmin创建数据库。

postgresql perl dbi

4
推荐指数
1
解决办法
542
查看次数

DBI::dbWriteTable,无效的多字节字符串

从 MS Access 数据库导入的大型数据集,然后按日期对数据进行子集并导出到 SQL 数据库。

通过 sqlsave 命令导出工作正常,但是由于数据集的大小(超过 500,000 行,包含 73 个变量),它不适合。

尝试使用 odbc 写入数据会生成以下错误: nchar(as.character(x)) 中的错误:多字节字符串无效,元素 62220

通过使用谷歌和浏览 Stackoverflow,我发现这个错误通常与数据中的非标准字符有关。

在尝试将表写入 SQL 之前,我已经使用 dplyr 删除了所有非标准字符,同样的错误。

然后我使用 UTF-8 编码将文件导出到 csv 并在尝试将表写入 SQL 之前使用 UTF-8 编码将其带回来,同样的错误。

最后,我尝试了一种指定最大列长度和格式为 varchar(255)、浮点数或日期的每列结构的方法。同样的错误。

library(odbc)
library(RODBC)
library(DBI)
library(data.table)

setwd("E:/BUS_INSIGHTS/David r scripts/PUNE_Claims")

odbcCEDBS0233 <- dbConnect(odbc::odbc(), dsn = "CEDBS0233")
CEDBS0233 = odbcConnect("CEDBS0233")

PUNE <- dbConnect(drv = odbc::odbc(), .connection_string = "Driver={Microsoft Access Driver (*.mdb, *.accdb)}; Dbq=E:/Motor/Data/ZC Combined/2018/1812/ZC Combined Pune.accdb")

PUNE <- subset(PUNE, DATE_OF_LOSS > as.Date("2009-01-01"))

require(dplyr)
clean <- PUNE %>% …
Run Code Online (Sandbox Code Playgroud)

sql encoding odbc dbi

4
推荐指数
1
解决办法
969
查看次数

使用 R(DBI 包)从 SQL Server 表中删除行

我在 SQL Server 中有一个表,我正在尝试向其中添加数据。在添加数据之前,我想删除所有现有记录,但我不想删除该表并重新创建它,因为它在 SQL Server 中创建了我想保留的索引。

我有什么选择来使用 r 来完成这个?

odbc r dbi dplyr

4
推荐指数
2
解决办法
4000
查看次数

result_fetch(res@ptr, n)': nanodbc/nanodbc.cpp:2966: 07009: [Microsoft][ODBC Driver 13 for SQL Server]描述符索引无效

我在 R 语言中遇到 MSSQL 问题,类似于R DBI ODBC 错误:nanodbc/nanodbc.cpp:3110: 07009: [Microsoft][ODBC Driver 13 for SQL Server]Invalid Descriptor Index,但还有一点,或者我不知道不明白某事。

我与数据库有明显的联系,当我发送如下内容时,我的 SELECT 起作用:

third <- DBI::dbGetQuery(con, "SELECT TOP 1 
                         arr_delay_new,
                         fl_date,
                         carrier,
                         origin_city_name,
                         dest_city_name
                   FROM Flight_delays 
                   ORDER BY arr_delay_new DESC")
Run Code Online (Sandbox Code Playgroud)

问题出在列顺序上。我必须以其他顺序显示响应 - 像这样:

third <- DBI::dbGetQuery(con, "SELECT TOP 1 
                         carrier,
                         arr_delay_new,
                         fl_date,
                         origin_city_name,
                         dest_city_name
                   FROM Flight_delays 
                   ORDER BY arr_delay_new DESC")
Run Code Online (Sandbox Code Playgroud)

当我发送此请求时 - 出现错误:“result_fetch(res@ptr, n)': nanodbc/nanodbc.cpp:2966: 07009: [Microsoft][ODBC Driver 13 for SQL Server]无效描述符索引”

我如何设置这个或哪种解决方法可以帮助我更改订单?

我对 R 语言很陌生,很抱歉,如果它太简单了

sql r dbi mssql-jdbc

4
推荐指数
1
解决办法
6730
查看次数

标签 统计

dbi ×10

perl ×6

mysql ×3

odbc ×3

sql ×3

postgresql ×2

r ×2

bash ×1

dplyr ×1

encoding ×1

mssql-jdbc ×1

ntext ×1

ruby ×1

sql-server ×1

sqlbindparameter ×1

truncated ×1

unix ×1

utf-8 ×1