我试图找出我应该用于各种类型数据的排序规则.我将存储的100%内容是用户提交的.
我的理解是我应该使用UTF-8通用CI(Case-Insensitive)而不是UTF-8 Binary.但是,我无法找到UTF-8 General CI和UTF-8 Unicode CI之间的区别.
我们以前的程序员在表(Mysql)中设置了错误的排序规则.当它应该是UTF8时,他用拉丁校对设置它,现在我有问题.每个有中文和日文字符的记录都会转到??? 字符.
是否可以更改整理并获取角色的细节?
我试图使用UTF-8并遇到麻烦.
我尝试了很多东西; 这是我得到的结果:
????而不是亚洲人物.即使是欧洲文本,我也得到Se?or了Señor.Señor或新浪新闻为????.Sefor Señor.我究竟做错了什么?我该如何修复代码?我可以恢复数据,如果是,如何恢复?
当我通过phpMyAdmin创建一个新的MySQL数据库时,我可以选择排序规则(例如-default,armscii8,ascii,...和UTF-8).我知道的是UTF-8,因为我总是在HTML源代码中看到这一点.但是默认排序规则是什么?这些选择之间有什么区别,我应该使用哪一个?
查看我的prod日志后,我提到了一些错误:
[2012-08-31 15:56:43] request.CRITICAL: Doctrine\DBAL\DBALException:
An exception occurred while executing 'SELECT t0.username ....... FROM fos_user t0 WHERE t0.username = ?'
with params {"1":"Nrv\u29e7Kasi"}:
SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT)
and (utf8_general_ci,COERCIBLE) for operation '='
Run Code Online (Sandbox Code Playgroud)
Alghout我在学说cfg下有UTF-8默认值:
doctrine:
dbal:
charset: UTF8
Run Code Online (Sandbox Code Playgroud)
好像我的所有MySQL表都在latin1_swedish_ci,所以我的问题是:
我是否可以手动更改utf8_general_ci所有表格的校对而无需任何复杂/预防措施?
我使用Python3,并尝试使用mysql.com中的MySQL Connector/Python
我有UTF-8编码表,当我获取行时,我的所有字符列都返回像bytearray一样.这让人有些困惑.
我怎么能直接获取str?
UPD:
# -*- coding: utf-8 -*-
import mysql.connector
con = mysql.connector.connect( user ="root", db = "vg_site_db", charset = 'utf8' )
cursor = con.cursor()
sql = """select caption from domains
"""
cursor.execute( sql )
row = cursor.fetchone()
while row is not None:
print( row )
row = cursor.fetchone()
Run Code Online (Sandbox Code Playgroud)
输出:
(bytearray(b'ezsp.ru'),)
(bytearray(b'eazyshop.ru'),)
(bytearray(b'127.0.0.1:8080'),)
(bytearray(b'rmsvet.ru'),)
Run Code Online (Sandbox Code Playgroud)
我想要:
('ezsp.ru',)
('eazyshop.ru',)
('127.0.0.1:8080',)
('rmsvet.ru',)
Run Code Online (Sandbox Code Playgroud)
UPD2:
我的表使用COLLATE utf8_bin
有谁知道MySQL的utf8_unicode_cs校对是否存在?到目前为止,我的搜索已经枯竭了.如果它还不存在,创建一个是否相当简单?或者以某种方式使用utf8_unicode_ci或utf8_bin但是"模拟"人们对utf8_unicode_cs整理的期望?
我无法使用MySQL和Drupal 7获得不区分大小写的查询.这是我的模块代码:
$results = db_select('people_table', 'p')->fields('p');
if (array_key_exists('department', $_GET)) {
$results->condition('Department', '%' . db_like($_GET['department']) . '%', 'LIKE');
}
return $results->orderBy('Name', 'ASC')->execute();
Run Code Online (Sandbox Code Playgroud)
随着?department=Chemistry在URL中,我得到三个结果.随着?department=chemistry在URL中,我没有得到任何结果.当我尝试时$results->condition('UPPER(Department)'...,我收到此错误:
PDOException:SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'UPPERDepartment':SELECT p.*FROM {people_table} p WHERE(UPPERDepartment LIKE:db_condition_placeholder_0 ESCAPE'\\')ORDER BY Name ASC;
所以看起来它吃掉了我的括号.我怎么能不区分大小写LIKE?
编辑:Department列和整个表上 的排序规则是utf8_bin. 这个答案说:"唯一特别的是utf8_bin,用于比较二进制格式的字符." 我不知道为什么选择这种排序规则,因为表中的所有数据都是英文文本.我可能只是将整理更改为utf8_general_ci.