考虑以下表格:
CREATE TABLE t1 (f1 VARCHAR(255));
则ruby
:
#!/usr/bin/env ruby
require 'json'
require 'sequel'
require 'mysql2'
DB = Sequel.connect(
:adapter => 'mysql2',
:database => 'd1',
:user => '<user>',
:password => '<password>',
:encoding => 'utf8')
v1 = '{"a":"bud83cudf4ec"}'
v2 = JSON.parse(v1)
p v2['a']
DB[:t1].truncate
DB[:t1].insert(f1: v2['a']);
p DB[:t1].first[:f1]
或php
:
#!/usr/bin/env php
<?php
$dbh = new PDO('mysql:dbname=d1', '<user>', '<password>', [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$dbh->exec('TRUNCATE TABLE t1');
$v1 = '{"a":"bud83cudf4ec"}';
$v2 = json_decode($v1);
var_dump($v2->a);
$sth = $dbh->prepare("INSERT INTO t1 VALUES (?)");
$sth->execute([$v2->a]);
$sth = $dbh->query("SELECT * FROM t1");
var_dump($sth->fetch()['f1']);
进入数据库的是b
。我正在运行mysql-5.1
,文档说:
MySQL 5.1支持两个字符集存储Unicode数据:
ucs2
, Unicode字符集的UCS-2编码,每个字符使用16位。
utf8
, Unicode字符集的UTF-8编码,每个字符使用一到三个字节。这两个字符集支持Unicode 3.0版本的基本多语言平面(BMP)的字符。BMP字符具有以下特征:
- 它们的代码值在0到65535(或
U+0000
..)之间。U+FFFF
)。
我做错了什么?
乌利希期刊指南
$ mysql -BNe 'SHOW CREATE TABLE t1' d1
t1 CREATE TABLE `t1` (n `f1` varchar(255) DEFAULT NULLn) ENGINE=InnoDB DEFAULT CHARSET=utf8
在我的MySQL 5.1 (from debian)做
CREATE TABLE t1 (f1 VARCHAR(255));
有效地创建了一个LATIN1表:
mysql> show CREATE TABLE t1 ;
+-------+---------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`f1` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+---------------------------------------------------------------------------------------------+
所以请先检查你的MySQL真的默认为UTF-8。
然后,我们知道MySQL不能存储BMP表中的每个字符。我没有找到相关的参考资料,但之前看到过。
因此,从mysql 5.5.3引入了一个新的utf8mb4全unicode支持字符集,如下所示:https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-upgrading.html
最后,即使BMP是表示它们介于0和0xFFFF之间,这并不意味着它们使用了所有这个空间,如下所示:https://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane这两个转义序列似乎只表示一个字符:RED APPLE (U+1F34E)。第一个是代孕妈妈。代理为:
UCS使用代理来在初始基本多语言平面之外寻址字符,而不使用超过16位字节的表示。
必须是这样,结果字符在BMP
之外。并且不被mysql
的utf8
字符集所支持。