- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
如果要将 unicode 数据保存到 MSSQL,则需要将其保存到列类型 nvarchar(等)中,并且必须在 SQL STRING LITERALS 前加上大写 N。如果您使用的是准备好的语句,则不需要前缀带 N 的值。
插入 tbl (col) 值 (N'hello')
如果您使用的是像 ZF DB 这样的 ORM,那么您正在使用 PDO 连接到 MSSQL(或者您正在 Windows 上部署,在这种情况下,您使用的是 SQLSRV 或 PDO_SQLSRV,并且一切正常,我的问题没有有意义了)。
如果您在 Linux 上使用连接到 mssql(sybase、dblib 等)的任何 PDO 变体,那么您不会获得真正的准备好的语句,只能模拟。
如果您模拟了准备好的语句,在线路级别,SQL 完全只用字符串文字写出,这意味着您必须在任何可能的 unicode 值前加上 N。
编辑:我可以从 Linux 获取 unicode 以保存到 MSSQL,但是将 FreeTDS 协议(protocol)升级到 7/8 似乎会破坏所有框架/库/orms,因为绝对需要改变带有 N 前缀的普通 SQL。我不确定 Internet 上声称升级到协议(protocol)版本 7/8 解决了他们的 unicode 问题的人除了以不可移植的方式手写每个 SQL 语句之外,实际上是如何做的。看来留在 Freetds 4.2 上是处理 Unicode/UTF-8 和 mssql 的最佳方式。
最佳答案
更新:驱动程序不再处于预览状态。 MS 已经为现在发布的版本提供了官方说明:https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu
以下说明现已过时,因为 MS 已取消预览驱动程序下载。
嗯,有微软提供的ODBC驱动。这应该在这方面提供适当的行为。 请参阅文章末尾了解我如何测试其行为(以初步方式)。它是针对 Azure SQL 数据库 V12 进行测试的。
如何在Ubuntu 16.04上安装Microsoft SQL ODBC驱动
这是在基于 Canonical 提供的 Ubuntu 16.04 Azure 镜像的全新 Ubuntu 16.04 Azure 实例上进行测试的。登录后,我使用 sudo -i
切换到 root 用户,然后:
apt-get update
apt-get -y install atool make build-essential libc6 libkrb5-3 libgss3 e2fsprogs openssl equivs
wget https://download.microsoft.com/download/2/E/5/2E58F097-805C-4AB8-9FC6-71288AB4409D/msodbcsql-13.0.0.0.tar.gz
atool -x msodbcsql-13.0.0.0.tar.gz
rm msodbcsql-13.0.0.0.tar.gz
pushd msodbcsql-13.0.0.0/
./build_dm.sh --accept-warning | tee build_dm_result.txt
command=$(cat build_dm_result.txt | grep "Run the command" | cut -d"'" -f2)
rm build_dm_result.txt
sh -c "$command"
popd
echo "/usr/lib64" > /etc/ld.so.conf.d/microsoft-lib64.conf
ldconfig
pushd msodbcsql-13.0.0.0/
./install.sh install --accept-license
测试一下
将以下命令中的服务器和凭据替换为您自己的。
sqlcmd -S somedatabase.database.windows.net -U someuser -P somepassword
此时您应该能够发出 SQL 命令。好的,让我们让它与 php 一起工作。
与 php 一起使用
我们必须确保没有安装 libodbc1 包,并且它不会被安装,因为 php 会使用它而不是我们自定义的编译包,这会导致编码问题。
cat > libodbc1<<EOL
Section: misc
Priority: optional
Standards-Version: 3.9.2
Package: libodbc1
Version: 9999
Description: fake pkg, so that we satisfy the dependency of php7-odbc, so that we can keep our custom built libodbc
EOL
equivs-build libodbc1
dpkg -i libodbc1_9999_all.deb
rm libodbc1
rm libodbc1_9999_all.deb
apt-get install php7.0-odbc php7.0-cli
此时,您应该可以使用它作为 ODBC 驱动程序。
测试其行为
创建一个 php 文件 test.php,UTF-8 编码,内容如下。将连接字符串中的服务器、数据库和凭据替换为您自己的。
<?php
$pdo = new PDO('odbc:Driver={ODBC Driver 13 for SQL Server};Server=tcp:somedatabase.database.windows.net,1433;Database=somedatabase;Uid=someuser@somedatabase;Pwd=somepassword;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;');
$str = 'Árvíztűrő tükörfúrógép, and... 你好,世界';
$pdo->prepare("DROP TABLE test")->execute();
$pdo->prepare("CREATE TABLE test(a NVARCHAR(MAX))")->execute();
$stmt = $pdo->prepare("INSERT INTO test VALUES(?)");
$stmt->bindParam(1, $str);
$stmt->execute();
$stmt = $pdo->prepare("SELECT * FROM test");
$stmt->execute();
$data = $stmt->fetchall();
var_dump($data[0][0]==$str); //Returns true
$stmt = $pdo->prepare("SELECT * FROM test WHERE a=?");
$stmt->bindParam(1, $str);
$stmt->execute();
$data = $stmt->fetchall();
var_dump($data[0][0]==$str); //Returns true
使用 php -f test.php
运行它表明我们取回了没有任何损坏的字符串。此外,该字符串在 SQL Server Management Studio 中看起来也不错。我在 Azure 门户的 Performance Insight 页面上观察到以下查询:(@P1 nvarchar(max))INSERT INTO test VALUES(@P1)
,所以显然使用了准备好的语句,所以我假设它可以处理你的(和我的)场景。
(这篇文章在尝试让它发挥作用时提供了很大帮助:http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ 谢谢鲍里斯!)
关于PHP、ORM、MSSQL 和 Unicode,是否可以让它们一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24230694/
我在我的 Linux(Ubuntu 16.04)服务器上安装 MSSQL 时遇到问题。 我使用了微软的手册,但我总是在同一阶段失败。 实际上,由于内核问题,Docker 不是替代品。 后: sudo
我正在尝试导入 mssql 我有一个 js 文件,它自己可以正常工作,但我需要这样做,以便我可以从 react js 环境中调用该函数,而不仅仅是节点 import React, { Componen
我对 python 比较陌生,对 django 也很陌生。 我正在尝试使用 django 连接到 MSSQL 服务器。我安装了django-mssql(也许它需要放在项目目录中的某个地方?)。 但是,
我想为我的项目使用 mssql 数据库。我采用了 node-mssql 模块 ( https://www.npmjs.com/package/mssql ) 并使用 Microsoft SQL Ser
我试图恢复 centos 服务器内的 mssql 文件。 .bak 文件已放入服务器并将用户设为 mssql。 [![在此处输入图像描述][1]][1] 这是我运行此命令进行恢复时的错误。 sqlcm
我正在尝试建立从 MSSQL (express 2008) 到 Mysql 的特定查询记录集的单向同步。这是该查询。 SELECT [datafk] ,[datahistorypk] ,[da
我正在尝试在 node.js 中编写脚本来查询 MSSQL 数据库。我是 javascript 的新手,node.js 的新手,VSCode 的新手,但我知道一些关于 SQL 的事情。我有工作代码,但
我正在尝试将我的 Golang 应用程序连接到 MSSQL 2014。 我已经成功使用 - https://github.com/denisenkom/go-mssqldb为此,我只在我的 MSSQL
在一个应用程序中,我有一个全局作用域 var db *sql.DB 稍后调用 slcstrSource, slcint64Timestamp, slcstrContent, err := DB_fun
我从服务器 A 创建了一个具有以下规范的 .bak 文件(备份):Windows Server 2003、MSSQL 2005。现在我想在具有以下规范的新服务器 B 上恢复此备份:Windows 8、
我的任务是将 Microsoft SQL Server 2005 数据库迁移到 MySQL 5.6(这些都是本地运行的数据库服务器),非常感谢您的帮助。 -MSSQL 源数据库有 latin1 排序规
我在这里不知所措。总的来说,我对 python 和 odbc 很陌生。但是,我需要找到一种方法,在 Web GUI 的后端有一个 python 脚本,作为我公司的内部工具,从以下位置与 MSSQL 服
下列语句部分是Mssql语句,不可以在access中使用。 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SEL
1.--区分大小写 select * from a where a='AbCdE' collate Ch
-->分段更新 -->Author:wufeng4552 -->Date :2009-10-07 08:13:41 --如:更新'a,a,a,a,a' 第三段a 為 'test'
这几天突然有个想法:希望能够自动监控、收集数据库服务器的磁盘容量信息,当达到一个阀值后,自动发送告警邮件给DBA,将数据库磁盘详细信息告知DBA,提醒DBA做好存储规划计划,初步的想法是通过作业调用
看到网上好多人问为什么我的SQL 2008只能用服务器计算器名登录,而不能用IP登录呢?我也遇到过这个问题,看到网上的回答各有千秋,但没有一个写得比较便于操作的。经过一番网络关键字(SQL 2008
最近在做一个几百万条数据的分页查询,研究了各种方案,在本机上用项目的实际数据库做测试,测试过程 is very 痛苦,不堪回首ing。现在废话不多说,直接上结果,相信这也是大多数搜索答案的人最愿意看
MS SQL基本语法及实例操作 一:建表并初始化 ============================ create database mf2011 --创
地图数据存放在sqlserver 2008中,使用mapxtreme7 开发时,使用Feature.Update()方法时出错的提示包含“MSSQL 将截断字符串或二进制数据” 主要原因就是给某个
我是一名优秀的程序员,十分优秀!