我试图使用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)
整个字符串都正确写入.知道我做错了什么吗?
我可以使用以下命令成功创建与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模块来隐藏我的凭据?可以吗?什么是最佳做法?
当我在DBVis中运行此更新SQL时,我收到一个错误(数据截断:第1行的列'描述'的数据太长).
但是,在Perl(DBI)中,这并没有给我一个我猜的错误,因为记录实际上是用截断值更新的.
谁能告诉我如何显示此错误?
我想了解,我的模块是否与MySQL共享DBI连接或没有.我想确定他们的连接ID.可能有更好的解决方案(我想知道它们),但第一个问题仍然是知道连接ID.
我有一个关于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.我该如何解决这个问题?
您好,我正在尝试通过 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)
有什么问题吗?
谢谢。
如何从Perl创建Postgres数据库?这在Perl Postgres DBI驱动程序DBD::Pg(或几乎其他任何地方)中没有记录。我需要能够从我的程序中创建一个临时数据库,而不是必须使用psql或pgAdmin创建数据库。
从 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 Server 中有一个表,我正在尝试向其中添加数据。在添加数据之前,我想删除所有现有记录,但我不想删除该表并重新创建它,因为它在 SQL Server 中创建了我想保留的索引。
我有什么选择来使用 r 来完成这个?
我在 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 语言很陌生,很抱歉,如果它太简单了