- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个这样的查询:
select C.* from stream_data AS sd
JOIN Conversations AS C
ON (C.conversationReferenceId = sd.stream_data_id AND smAccountId = ?)
WHERE sd.stream_id = ? LIMIT 1
我们使用 AdoDB 运行它。像这样:
$object = new Conversation();
$object->LoadFromRawQuery("select C.* from stream_data AS sd JOIN Conversations AS C ON (C.conversationReferenceId = sd.stream_data_id AND smAccountId = ?) WHERE sd.stream_id = ? LIMIT 1", array($socialmediaAccountId, $parentSourceId));
(注意:我们有一个 AdoDB 的自定义版本,它在 AdoDB_RecordSet 类中有一个名为 LoadFromRawQuery 的方法,但是使用标准的 Execute() 方法调用可以看到这个问题,所以我顺其自然。)
为了提高此查询的性能(基于我们的索引),我们添加了一个转换运算符:
#Query:
select C.* from stream_data AS sd
JOIN Conversations AS C
ON (C.conversationReferenceId = cast(sd.stream_data_id as char) collate utf8_unicode_ci AND smAccountId = ?)
WHERE sd.stream_id = ? LIMIT 1
#PHP
$object = new Conversation();
$object->LoadFromRawQuery("select C.* from stream_data AS sd JOIN Conversations AS C ON (C.conversationReferenceId = cast(sd.stream_data_id as char) collate utf8_unicode_ci AND smAccountId = ?) WHERE sd.stream_id = ? LIMIT 1", array($socialmediaAccountId, $parentSourceId));
这两个操作在Console中都有效,但是在AdoDB中,第一个操作成功,而第二个操作失败。我们所有的表格都使用 UTF8 字符集。
帮助。
最佳答案
问题是 - 默认情况下 ADODB 不知道数据库的字符集。因此,它要求 MySQL 通过如下查询提供相同的信息:
mysql> SELECT default_character_set_name FROM information_schema.SCHEMATA S
-> WHERE schema_name = "xxxxxx";
+----------------------------+
| default_character_set_name |
+----------------------------+
| latin1 |
+----------------------------+
1 row in set (0.00 sec)
这将返回 latin1,因为 Latin1 中 mysql 中的默认字符集是 latin1。您可以在创建数据库时通过添加字符集 ( http://dev.mysql.com/doc/refman/5.0/en/create-database.html ) 修复它,因为 MySQL 的数据库在 latin1 上,但表在 utf8 中,MySQL 努力返回 latin1。现在,AdoDB 将连接设置为 latin1。
当这与您的排序规则“utf8_unicode_ci”混合时,MySQL 返回错误:
ErrorMsg: COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'latin1'
现在,您有两个选择。设置数据库连接时,调用以下命令强制将连接设置为 ut8 字符集:
$object->DB()->SetCharSet('utf8');
// Or
$connection->SetCharSet('utf8');
建议:
或者,不是将元素转换为字符串,而是将 '' 与数字连接起来,此时 MySQL 将为您转换它并使用正确的排序规则,因此您不会有错误 - 并且我使用 EXPLAIN 检查 - 转换和连接版本都使用相同的索引和排序结构:
#Query:
select C.* from stream_data AS sd
JOIN Conversations AS C
ON (C.conversationReferenceId = CONCAT('', sd.stream_data_id) AND smAccountId = ?)
WHERE sd.stream_id = ? LIMIT 1
#PHP
$object = new Conversation();
$object->LoadFromRawQuery("select C.* from stream_data AS sd JOIN Conversations AS C ON (C.conversationReferenceId = CONCAT('', sd.stream_data_id) AND smAccountId = ?) WHERE sd.stream_id = ? LIMIT 1", array($socialmediaAccountId, $parentSourceId));
echo("\r\n"."SQL : ".'select C.* from stream_data AS sd JOIN Conversations AS C ON (C.conversationReferenceId = CONCAT(\'\', sd.stream_data_id) AND smAccountId = ?) WHERE sd.stream_id = ? LIMIT 1'."\r\n");
echo("\r\n".'RESULT OBJECT AFTER DOING THE CONCAT : '."\r\n".json_encode($parentConversation)."\r\n");
关于php - AdoDB 函数不适用于 MySQL 查询中的 utf8 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17904373/
使用 VBA 连接 Access DB 时遇到一个奇怪的错误。 VBA 代码如下所示: Sub DBC() Dim cn As ADODB.Connection Dim rs As A
我有一些现有的代码,使用不同的参数重复查询 SQL 数据库,我认为如果我将其更改为在开始时选择一大块数据到 ADODB.Recordset 中,然后在循环查询此记录集而不是数据库本身。 一个额外的警告
我用下面的代码填充了一个数据表—— OleDbDataAdapter oleDA = new OleDbDataAdapter(); DataTable dt = new DataTable(); o
... 或从 QueryTables 中提取记录。 最佳答案 试试这个排序: SQLDatabase_VBA.bas将来自 ADODB 或系统的 SQL 数据库与 Excel 中的 VBA 连接 sc
看,我遇到了一个问题,它开始让我有些头痛,因为我找啊找,但仍然不走运。 我必须从 C# 执行 DLL 的方法,这个 DLL 是 4 年前在 VB 6.0 中创建的,并且在 COM 中注册。它使用 AD
我一直在 Excel 中使用 ADODB 连接,以便连接到 MySql 数据库并检索值。 我的代码的本质如下: Public Function ODPH(B0 As Range, sqlstr As
Function filenum(filename,i) Dim st,s Set&nb
翻了半天MSDN后找到的,|后边是别名 复制代码代码如下: ANSI_X3.4-1968|iso-8859-1 ANSI_X3.4-1986|iso-8859-1&nb
1. 前言 ADODB 是 Active Data Objects Data Base 的简称,它是一种 PHP 存取数据库的函式组件。现在 SFS3 系统 (校园自由软件交流网学务系统) 计划的
在 Excel 2010 中,我正在编写一个将大文本文件加载到记录集中的 vb 应用程序。 文本文件是一个日志文件,用空格分隔,并且没有任何列标题的第一行。 我可以使用适当的 schema.ini 文
我想弄清楚如何在 VBA excel 中使用 ADODB 进行多行插入。 我的问题似乎是我无法找出用于这个简单任务的正确语法,即使在搜索之后我仍然不知道它为什么不起作用。 使用语句进行单次插入没有问题
我试图从包含 80,000 多行的工作表中检索数据并将这些值打印到工作表中,但是当我创建记录集并查看其记录计数时,它只包含 16,492 条记录。 我是 ADODB 连接的新手,所以我对问题所在感到困
我在Delphi 7中使用ADODB,对于UPDATE查询,我使用TADOConnection执行过程“ recordsAffected”变量获取了修改后的记录数。 像这样 : MyConnexio
JavaScript ADODBE 连接如何在查询中放置它们或它们之间。需要帮助: rs.Open("update customer set Name='" + txtname + "',F_Name
我正在使用 adodb 和 php。我需要将 html 插入数据库,并且需要知道在将其插入数据库之前转义引号的最佳方法?我尝试使用 pg_escape_string() 但它似乎仍然没有插入。 执行此
我在 Excel 中有一个表,该表通过与 Access 数据库的连接进行填充。我正在尝试编写一个宏,允许您从此表中删除各个行。我使用 ADODB 连接将删除命令传递给 Access,效果很好。但是,在
我必须在我的 Delphi 应用程序中创建 dbf 文件。 对于本例,我使用 ADODB。 连接字符串: const ConnStringDBF = 'Driver={Microsoft dB
所以我是 Visual Basic 的新手,继承了我现在需要处理的 VB6 代码。现在,我正在尝试使用 ADODB.RecordSet 更新 SQL 数据库。我有一个 Select SQL 语句,可以
在 Excel 中,我使用 ADODB 连接来构建记录集,从其自己的工作簿中的工作表中获取数据,如下所示: Public Sub test() Dim cnn As New ADODB.Con
我想知道为什么当我把 sql ADODB在一个函数中查询它会产生以下错误: Fatal error: Call to a member function Execute() on a non-obje
我是一名优秀的程序员,十分优秀!