2

照合の問題があります。このテーブルの 3 つの列、creation_date、product_id、および lastmodified に影響があります。

列を utf8mb4 に変更しましたが、受け入れられません。下記を参照してください。

CREATE TABLE `users` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `creation_date` datetime DEFAULT NULL,
  `product_id` int(32) DEFAULT NULL,
  `lastmodified` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=121 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

クエリ:

select * from users u where u.name like '%philėp%'
No errors, 1 row.

select * from users u where u.creation_date like '%philėp%'
Illegal mix of collations for operation 'like'

MySQL システム変数:

show variables like '%character_set%';
character_set_client    utf8
character_set_connection    utf8
character_set_database  utf8
character_set_filesystem    binary
character_set_results   utf8
character_set_server    utf8mb4
character_set_system    utf8

MySQLに手動でステートメントの列を変換させると機能します。

select * from users u where CONVERT(u.creation_date USING utf8mb4) like '%philėp%'
No errors; 0 rows;

もうutf8mb4形式じゃないの?

助けていただければ幸いです。

4

1 に答える 1

3

これが私の理解です。

DATETIMEには照合がありません。

INTが数値であるためにそうでないのと同様

ただし、 DATETIMEに対してクエリ (または挿入) を行う場合は、そのようにフォーマットされた文字列を使用しています。これは、クエリの文字列とデータベースのDATETIME値の間で暗黙的な変換が可能であることを意味します。

ここで問題を引き起こしているのは、この暗黙の変換です。

さらに、アンダースコア付きのcreation_dateとなしでlastmodifiedを使用しています。これは実際にはアンダースコアを使用するか、または使用せずに両方にする必要があります。クエリと大きな違いはありませんが、データベースの標準を維持するのに役立ちます。

于 2013-01-25T09:54:43.370 に答える